home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / DCC_3DE.ZIP / CHEVY.ASM < prev    next >
Assembly Source File  |  1996-01-25  |  84KB  |  2,551 lines

  1. ; ============================================================================
  2. ; THE FINAL DONUT ROUTINE by ZJACK with assistance from X-wizard
  3. ; ============================================================================
  4. ; up to 65536 polys
  5. ; ============================================================================
  6. ;- I decided to give you a small piece of my tiny knowledge about i80486
  7. ;  realmode coding and I hope you'll find some new tricks......
  8. ;- Only the innerloops are optimized. Of course WATCOM C would do it better,
  9. ;  but I haven't that one........No evil ESP or SP optimizations are used....
  10. ; ============================================================================
  11. ; Install HIMEM.SYS and set the RealFlatmode on (newer HIMEM.SYS
  12. ; versions has built in flatmode support, DOS 6.2+ I guess)
  13. ; Recompile with TASM&TLINK, don't care about fixup overflows.....
  14.  
  15. .model small
  16. .stack 4096h
  17. .486P
  18.  
  19. MATERIAL segment para public
  20. include mat.db                    ;one byte (palette offset) per face
  21. MATERIAL ends
  22.  
  23. TEXTURE segment para public
  24. include texture.db                ;256x256x256 texture RAW
  25. TEXTURE ends
  26.  
  27. LOADBUFFER segment para public
  28. db 65500 dup (0)                  ;temporary work area, virtual screen
  29. LOADBUFFER ends
  30.  
  31. BACK segment para public
  32. include bakki.db                   ;320x200 background .SCX
  33. BACK ends
  34.  
  35. ; Put the rasterbars on if you have _128_ kB cache like me, and mix the
  36. ; segment order, you can see the difference....
  37.  
  38. .code
  39.       include jumps.asm
  40.       call makepath       ;precalcs the movement, easy to synchronize later...
  41.       mov ax,4300h
  42.       int 2fh
  43.       cmp al,80h
  44.       je @XMSOK
  45.       mov byte ptr cs:[errr],2  ;no xms-driver installed
  46.       jmp exit
  47.       @XMSOK:
  48.       smsw ax
  49.       test ax,1
  50.       je NOTV86MODE             ;qemm test...
  51.       mov byte ptr cs:[errr],7
  52.       jmp exit
  53.       NOTV86MODE:
  54.       call getsomexms  ;reserves some XMS
  55.       call xmslock     ;locks the xms-block
  56.       call copyright   ;copyright msg
  57.       call loadobject  ;loads to objects needed to XMS
  58.       xor ax,ax
  59.       mov si,offset yadd
  60.       LLL:
  61.       mov word ptr cs:[si],ax    ;yadd (0..199)*320 table....
  62.       add si,2
  63.       add ax,320
  64.       cmp ax,64000
  65.       jne LLL
  66.       mov ax,13h
  67.       int 10h
  68.       call palette
  69.       xor di,di
  70.       mov si,768+10
  71.       push seg back
  72.       pop gs                            ;first time flip
  73.       push seg loadbuffer
  74.       pop fs
  75.       push 0a000h
  76.       pop ds
  77.       IK:
  78.       mov al,byte ptr gs:[si]
  79.       mov byte ptr gs:[di],al
  80.       mov byte ptr fs:[di],al
  81.       inc di
  82.       inc si
  83.       cmp di,64000
  84.       jne IK
  85.       push cs
  86.       pop ds
  87.       call prefix                      ;XY's & stuff, prepare env-buffers
  88.       call updateworld                 ;first time settings
  89.       mov eax,dword ptr cs:[sorttixms]
  90.       shr eax,2                        ;sort tables are word aligned,
  91.       jnc FIX1o                        ;make them to dword aligned....
  92.       add dword ptr cs:[sorttixms],2
  93.       FIX1o:
  94.       mov eax,dword ptr cs:[onearrayxms]
  95.       shr eax,2
  96.       jnc FIX2o
  97.       add dword ptr cs:[onearrayxms],2
  98.       FIX2o:
  99.  
  100. MAIN:
  101.  
  102.         call doenginestuff               ;call the routine
  103.         inc dword ptr cs:[frame]         ;update movement
  104.         inc dword ptr cs:[frame]         ;update movement
  105.         inc dword ptr cs:[frame]         ;update movement
  106.         inc dword ptr cs:[frame]         ;update movement
  107.         cmp dword ptr cs:[frame],208     ;208 frames motion have we....
  108.         jae CRASH
  109.         cmp byte ptr cs:[errr],0
  110.         jne crash
  111.         in al,60h
  112.         cmp al,1
  113.         jne MAIN
  114. CRASH:
  115.         mov ax,003h
  116.         int 10h
  117.         jmp exit
  118.  
  119. ;---------------------------------------------------------------
  120. makepath:
  121.           xor di,di                       ;first set the start values
  122.           mov word ptr cs:[worldxangle],512+256
  123.           mov word ptr cs:[worldyangle],512
  124.           mov word ptr cs:[worldzangle],0
  125.           mov word ptr cs:[cameraxpos],0
  126.           mov word ptr cs:[cameraypos],0
  127.           mov word ptr cs:[camerazpos],2500    ;too small z -> CRASHH!!!!!!!
  128. LONGER:                                        ;no anykind of Z-CLIP
  129.           mov ax,word ptr cs:[worldxangle]
  130.           mov word ptr cs:[path+di],ax
  131.           mov ax,word ptr cs:[worldyangle]
  132.           mov word ptr cs:[path+di+2],ax
  133.           mov ax,word ptr cs:[worldzangle]
  134.           mov word ptr cs:[path+di+4],ax
  135.           mov ax,word ptr cs:[cameraxpos]
  136.           mov word ptr cs:[path+di+6],ax
  137.           mov ax,word ptr cs:[cameraypos]
  138.           mov word ptr cs:[path+di+8],ax
  139.           mov ax,word ptr cs:[camerazpos]
  140.           mov word ptr cs:[path+di+10],ax           ;save path
  141.         ;  add word ptr cs:[worldyangle],16
  142.         ;  dec word ptr cs:[worldxangle]
  143.           cmp word ptr cs:[worldyangle],1023
  144.           jna OKX
  145.           mov word ptr cs:[worldyangle],0
  146.           OKX:
  147.           cmp word ptr cs:[worldxangle],1023
  148.           jna OKY
  149.           mov word ptr cs:[worldxangle],0
  150.           OKY:
  151.           add word ptr cs:[camerazpos],32
  152.           add di,12    ;6 words per frame, easy to expand
  153.           cmp di,12*32
  154.           jne LONGER
  155. LONGER2:
  156.           mov ax,word ptr cs:[worldxangle]
  157.           mov word ptr cs:[path+di],ax
  158.           mov ax,word ptr cs:[worldyangle]
  159.           mov word ptr cs:[path+di+2],ax
  160.           mov ax,word ptr cs:[worldzangle]
  161.           mov word ptr cs:[path+di+4],ax
  162.           mov ax,word ptr cs:[cameraxpos]
  163.           mov word ptr cs:[path+di+6],ax
  164.           mov ax,word ptr cs:[cameraypos]
  165.           mov word ptr cs:[path+di+8],ax
  166.           mov ax,word ptr cs:[camerazpos]
  167.           mov word ptr cs:[path+di+10],ax           ;save path
  168.           add word ptr cs:[worldyangle],16
  169.        ;   dec word ptr cs:[worldxangle]
  170.           cmp word ptr cs:[worldyangle],1023
  171.           jna OKX2
  172.           mov word ptr cs:[worldyangle],0
  173.           OKX2:
  174.           cmp word ptr cs:[worldxangle],1023
  175.           jna OKY2
  176.           mov word ptr cs:[worldxangle],0
  177.           OKY2:
  178.         ;  add word ptr cs:[camerazpos],32
  179.           add di,12
  180.           cmp di,12*64
  181.           jne LONGER2
  182. LONGER3:
  183.           mov ax,word ptr cs:[worldxangle]
  184.           mov word ptr cs:[path+di],ax
  185.           mov ax,word ptr cs:[worldyangle]
  186.           mov word ptr cs:[path+di+2],ax
  187.           mov ax,word ptr cs:[worldzangle]
  188.           mov word ptr cs:[path+di+4],ax
  189.           mov ax,word ptr cs:[cameraxpos]
  190.           mov word ptr cs:[path+di+6],ax
  191.           mov ax,word ptr cs:[cameraypos]
  192.           mov word ptr cs:[path+di+8],ax
  193.           mov ax,word ptr cs:[camerazpos]
  194.           mov word ptr cs:[path+di+10],ax           ;save path
  195.           add word ptr cs:[worldyangle],12
  196.         ;  add word ptr cs:[worldxangle],2
  197.           inc word ptr cs:[worldxangle]
  198.         ;  add word ptr cs:[worldxangle],2
  199.           cmp word ptr cs:[worldyangle],1023
  200.           jna OKX23
  201.           mov word ptr cs:[worldyangle],0
  202.           OKX23:
  203.           cmp word ptr cs:[worldxangle],1023
  204.           jna OKY23
  205.           mov word ptr cs:[worldxangle],0
  206.           OKY23:
  207.           sub word ptr cs:[camerazpos],8
  208.           add word ptr cs:[cameraypos],6
  209.       ;    add word ptr cs:[cameraxpos],16
  210.           add di,12
  211.           cmp di,12*(128+32)
  212.           jne LONGER3
  213. LONGER34:
  214.           mov ax,word ptr cs:[worldxangle]
  215.           mov word ptr cs:[path+di],ax
  216.           mov ax,word ptr cs:[worldyangle]
  217.           mov word ptr cs:[path+di+2],ax
  218.           mov ax,word ptr cs:[worldzangle]
  219.           mov word ptr cs:[path+di+4],ax
  220.           mov ax,word ptr cs:[cameraxpos]
  221.           mov word ptr cs:[path+di+6],ax
  222.           mov ax,word ptr cs:[cameraypos]
  223.           mov word ptr cs:[path+di+8],ax
  224.           mov ax,word ptr cs:[camerazpos]
  225.           mov word ptr cs:[path+di+10],ax           ;save path
  226.         ;  add word ptr cs:[worldyangle],8
  227.         ;  add word ptr cs:[worldxangle],2
  228.           sub word ptr cs:[worldxangle],2
  229.         ;  add word ptr cs:[worldxangle],2
  230.           cmp word ptr cs:[worldyangle],1023
  231.           jna OKX234
  232.           mov word ptr cs:[worldyangle],0
  233.           OKX234:
  234.           cmp word ptr cs:[worldxangle],1023
  235.           jna OKY234
  236.           mov word ptr cs:[worldxangle],0
  237.           OKY234:
  238.         ;  sub word ptr cs:[camerazpos],8
  239.         ;  add word ptr cs:[cameraypos],8
  240.           add word ptr cs:[cameraxpos],128
  241.           add di,12
  242.           cmp di,12*(128+32+32)
  243.           jne LONGER34
  244. LONGER345:
  245.           mov ax,word ptr cs:[worldxangle]
  246.           mov word ptr cs:[path+di],ax
  247.           mov ax,word ptr cs:[worldyangle]
  248.           mov word ptr cs:[path+di+2],ax
  249.           mov ax,word ptr cs:[worldzangle]
  250.           mov word ptr cs:[path+di+4],ax
  251.           mov ax,word ptr cs:[cameraxpos]
  252.           mov word ptr cs:[path+di+6],ax
  253.           mov ax,word ptr cs:[cameraypos]
  254.           mov word ptr cs:[path+di+8],ax
  255.           mov ax,word ptr cs:[camerazpos]
  256.           mov word ptr cs:[path+di+10],ax           ;save path
  257.         ;  add word ptr cs:[worldyangle],8
  258.         ;  add word ptr cs:[worldxangle],2
  259.          ; sub word ptr cs:[worldxangle],4
  260.         ;  add word ptr cs:[worldxangle],2
  261.           cmp word ptr cs:[worldyangle],1023
  262.           jna OKX2345
  263.           mov word ptr cs:[worldyangle],0
  264.           OKX2345:
  265.           cmp word ptr cs:[worldxangle],1023
  266.           jna OKY2345
  267.           mov word ptr cs:[worldxangle],0
  268.           OKY2345:
  269.         ;  sub word ptr cs:[camerazpos],8
  270.         ;  add word ptr cs:[cameraypos],8
  271.           add word ptr cs:[cameraxpos],128
  272.           add di,12
  273.           cmp di,12*(128+32+32+16)
  274.           jne LONGER345
  275.  
  276.           ret
  277. ;----------------------------------------------------------------
  278. loadobject:
  279.            mov word ptr cs:[swap],0
  280.            mov eax,dword ptr cs:[objectxms]
  281.            mov dword ptr cs:[lastxms],eax
  282.            mov dword ptr cs:[elementxms],eax
  283. LEFTELEMENTS:
  284.            push cs
  285.            pop ds
  286.            clc
  287.            mov ax,3d00h    ;open file for reading
  288.            mov dx,word ptr cs:[swap] ;file number
  289.            shl dx,3        ;file name length=8 (7+zero)
  290.            add dx,offset names
  291.            int 21h
  292.            jnc @FILEOK
  293.            pop cx                 ;removes the return address from stack
  294.            mov byte ptr cs:[errr],4 ;file-error
  295.            jmp exit
  296.            @FILEOK:
  297.            mov esi,dword ptr cs:[lastxms]
  298.            mov bx,ax    ;Bx=filehandle
  299.            mov ax,0
  300.            mov es,ax     ;flat memory model...
  301.            mov word ptr cs:[fhandle],bx
  302.            @LOADMORE:
  303.            mov bx,word ptr cs:[fhandle]
  304.            mov ah,3fh
  305.            mov cx,65000  ;read 65000 bytes
  306.            push seg loadbuffer
  307.            pop ds
  308.            xor dx,dx
  309.            int 21h
  310.            mov cx,ax
  311.            cmp ax,0
  312.            je fileend      ;if we are in eof then ax is zero
  313.            xor di,di
  314.            TRANSFER:
  315.            mov al,byte ptr ds:[di]  ;get byte from buffer1
  316.            mov byte ptr es:[esi],al ;put it into the xmsblock
  317.            inc di
  318.            inc esi
  319.            cmp di,cx          ;cx=how many bytes loaded this time
  320.            jne TRANSFER
  321.            push cs
  322.            pop ds
  323.            mov dx,offset dot  ;progress dot.....
  324.            mov ah,09h
  325.            int 21h
  326.            jmp @LOADMORE
  327.            fileend:
  328.            mov dword ptr cs:[lastxms],esi    ;offset to next object
  329.            inc word ptr cs:[swap]
  330.            mov bx,word ptr cs:[swap]
  331.            add bx,bx
  332.            add bx,bx
  333.            mov dword ptr cs:[elementxms+bx],esi ;save the object ptrs
  334.            mov bx,word ptr cs:[fhandle]
  335.            mov ah,3eh
  336.            int 21h              ;close the file
  337.            mov ax,word ptr cs:[elements]
  338.            cmp word ptr cs:[swap],ax
  339.            jne LEFTELEMENTS
  340.            ret
  341.  
  342.  
  343. getsomexms:
  344.             push cs
  345.             pop ds
  346.             mov ax,4310h
  347.             int 2fh                    ;get the driver location
  348.             mov word ptr cs:[xmscontrol],bx
  349.             mov word ptr cs:[xmscontrol+2],es
  350.             mov ah,09h
  351.             mov dx,(2536);             ;we need about 2.5 megs
  352.             call cs:[xmscontrol]
  353.             cmp ax,1
  354.             je @MEMOK
  355.             pop cx                    ;cleans the stack
  356.             mov byte ptr cs:[errr],3
  357.             jmp exit                  ;not enough XMS
  358.             @MEMOK:
  359.             mov word ptr cs:[xhandle],dx
  360.             ret
  361.  
  362. freexms:
  363.             mov ah,0ah
  364.             mov dx,word ptr cs:[xhandle]
  365.             call cs:[xmscontrol]
  366.             ret
  367.  
  368. xmslock:
  369.              mov ah,0ch
  370.              mov dx,word ptr cs:[xhandle]
  371.              call cs:[xmscontrol]
  372.              mov ax,dx
  373.              shl eax,16
  374.              mov ax,bx
  375.              mov ecx,eax
  376.              shr ecx,1
  377.              jnc ALIGNis2
  378.              inc eax              ;make sure that pointers are word-aligned.
  379.              ALIGNis2:
  380.              mov dword ptr cs:[objectxms],eax
  381.              mov dword ptr cs:[elementxms],eax
  382.              add eax,(1200)*1024
  383.              mov dword ptr cs:[projectionbuffer],eax
  384.              add eax,(260)*1024
  385.              mov dword ptr cs:[envbufxms],eax
  386.              add eax,(816)*1024
  387.              mov dword ptr cs:[sorttixms],eax
  388.              add eax,(130)*1024
  389.              mov dword ptr cs:[onearrayxms],eax
  390.              ret
  391.  
  392. unlock:
  393.              push ds
  394.              mov ah,0dh
  395.              mov dx,word ptr cs:[xhandle]
  396.              call cs:[xmscontrol]
  397.              pop ds
  398.              ret
  399.  
  400.  
  401. ;-------------------------------------------------------------------------
  402. doenginestuff:
  403.             ;  call morph
  404.                call WORLDINIT
  405.                mov word ptr cs:[swap],0
  406.                @INITOBJECTS:
  407.                call WORLDHANDLE
  408.                inc word ptr cs:[swap]
  409.                mov ax,word ptr cs:[world] ;how many objects
  410.                cmp word ptr cs:[swap],ax
  411.                jne @INITOBJECTS
  412.                call sortobjects
  413.                mov word ptr cs:[swap],0
  414. @OBJECTSLEFT:
  415.                mov bx,word ptr cs:[swap]
  416.                shl bx,5
  417.                mov ax,word ptr cs:[zclipnear]
  418.                cmp word ptr cs:[(bx+world+2)+16+4+2],ax
  419.                jng @ALLFACESHIDDEN   ;object.in.world is behind the camera!
  420.                call setobject
  421.                call rotate
  422.                call initsortbuffer
  423.                cmp word ptr cs:[facecount],0
  424.                je @ALLFACESHIDDEN
  425.                call bytesort     ;remove if you like unsorted stuff ;)
  426.                call environment  ;remove if you like, default U&Vs sucks...
  427.                call txdrawpolys
  428.                @ALLFACESHIDDEN:
  429.                inc word ptr cs:[swap]
  430.                mov ax,word ptr cs:[world] ;how many objects
  431.                cmp word ptr cs:[swap],ax
  432.                jne @OBJECTSLEFT
  433.            ;    call retrace
  434.                call flips
  435.                call UPDATEWORLD  ;movements/action scripts
  436.             ;   call umorp       ;update morph pointers
  437.                ret
  438. ;---------------------------------------------------------------
  439. WORLDINIT:    push cs
  440.               pop ds
  441.               mov bx,word ptr ds:[worldxangle]      ;start matrix calculation
  442.               mov si,word ptr ds:[worldyangle]
  443.               mov di,word ptr ds:[worldzangle]
  444.               add bx,bx
  445.               add si,si
  446.               add di,di
  447.  
  448.             mov bp,word ptr ds:[sine+bx]
  449.             mov bx,word ptr ds:[cose+bx]
  450.             mov ax,word ptr ds:[cose+si]
  451.             mov word ptr ds:[coy],ax
  452.             mov si,word ptr ds:[sine+si]
  453.             mov ax,word ptr ds:[sine+di]
  454.             mov word ptr ds:[siz],ax
  455.             mov di,word ptr ds:[cose+di]
  456.  
  457.             mov ax,word ptr ds:[coy]
  458.             imul di
  459.             mov al,ah
  460.             mov ah,dl
  461.             mov word ptr ds:[wphase1+1],ax
  462.             mov ax,si
  463.             imul di
  464.             mov al,ah
  465.             mov ah,dl
  466.             imul bp
  467.             mov cl,ah
  468.             mov ch,dl
  469.             mov ax,word ptr ds:[siz]
  470.             imul bx
  471.             mov al,ah
  472.             mov ah,dl
  473.             add ax,cx
  474.             mov word ptr ds:[wphase2+1],ax
  475.             mov ax,si
  476.             imul di
  477.             mov al,ah
  478.             mov ah,dl
  479.             imul bx
  480.             mov cl,ah
  481.             mov ch,dl
  482.             mov ax,word ptr ds:[siz]
  483.             imul bp
  484.             mov al,ah
  485.             mov ah,dl
  486.             sub ax,cx
  487.             mov word ptr ds:[wphase3+1],ax
  488.  
  489.             mov ax,word ptr ds:[siz]
  490.             neg ax
  491.             imul word ptr ds:[coy]
  492.             mov al,ah
  493.             mov ah,dl
  494.             mov word ptr ds:[wphase4+1],ax
  495.             mov ax,word ptr ds:[siz]
  496.             imul si
  497.             mov al,ah
  498.             mov ah,dl
  499.             imul bp
  500.             mov cl,ah
  501.             mov ch,dl
  502.             mov ax,bx
  503.             imul di
  504.             mov al,ah
  505.             mov ah,dl
  506.             sub ax,cx
  507.             mov word ptr ds:[wphase5+1],ax
  508.  
  509.             mov ax,word ptr ds:[siz]
  510.             imul si
  511.             mov al,ah
  512.             mov ah,dl
  513.             imul bx
  514.             mov al,ah
  515.             mov ah,dl
  516.             mov cx,ax
  517.             mov ax,bp
  518.             imul di
  519.             mov al,ah
  520.             mov ah,dl
  521.             add ax,cx
  522.             mov word ptr ds:[wphase6+1],ax
  523.  
  524.             mov ax,si
  525.             mov word ptr ds:[wphase7+1],ax
  526.             mov ax,word ptr ds:[coy]
  527.             neg ax
  528.             imul bp
  529.             mov al,ah
  530.             mov ah,dl
  531.             mov word ptr ds:[wphase8+1],ax
  532.             mov ax,word ptr ds:[coy]
  533.             imul bx
  534.             mov al,ah
  535.             mov ah,dl
  536.             mov word ptr ds:[wphase9+1],ax
  537.             mov ax,word ptr ds:[wphase1+1]            ;constants
  538.             mov bx,word ptr ds:[wphase2+1]            ;for 6-mul system
  539.             imul bx
  540.             mov al,ah
  541.             mov ah,dl
  542.             mov word ptr ds:[wcp1+1],ax
  543.             mov ax,word ptr ds:[wphase4+1]            ;constants
  544.             mov bx,word ptr ds:[wphase5+1]            ;for 6-mul system
  545.             imul bx
  546.             mov al,ah
  547.             mov ah,dl
  548.             mov word ptr ds:[wcp2+1],ax
  549.             mov ax,word ptr ds:[wphase7+1]            ;constants
  550.             mov bx,word ptr ds:[wphase8+1]            ;for 6-mul system
  551.             imul bx
  552.             mov al,ah
  553.             mov ah,dl
  554.             mov word ptr ds:[wcp3+1],ax
  555.             mov ax,word ptr ds:[viewpointx]
  556.             imul word ptr ds:[viewpointy]
  557.             mov al,ah
  558.             mov ah,dl
  559.             mov word ptr ds:[viewpointxy],ax
  560.             ret
  561.  
  562. WORLDHANDLE:
  563.             push cs
  564.             pop ds
  565.             mov bx,word ptr ds:[swap]
  566.             shl bx,5                       ;32 bytes/object 16 data, 16 swap
  567.             add bx,offset world+2
  568.             mov ax,word ptr ds:[bx+2]      ;object.in.world.xpos
  569.             mov cx,word ptr ds:[bx+4]
  570.             imul cx                        ;object.in.world.ypos
  571.             mov al,ah
  572.             mov ah,dl
  573.             mov di,ax     ;object.in.world.xypos
  574.             add di,word ptr ds:[viewpointxy]
  575.             cmp byte ptr ds:[bx+1],255
  576.             je @INDEPENDENT
  577.             mov eax,dword ptr ds:[worldxangle]
  578.             mov dword ptr ds:[bx+16+10],eax
  579.             mov ax,word ptr ds:[worldzangle]
  580.             mov word ptr ds:[bx+16+14],ax
  581.             jmp @SETOK
  582.             @INDEPENDENT:
  583.             mov eax,dword ptr ds:[bx+10]    ;object.in.world.angle.x
  584.             mov dword ptr ds:[bx+16+10],eax
  585.             mov ax,word ptr ds:[bx+14]      ;object.in.world.angle.x
  586.             mov word ptr ds:[bx+16+14],ax
  587.             @SETOK:
  588.             mov bp,word ptr ds:[bx+6]       ;bp=object.in.world.z
  589.             add bp,word ptr ds:[viewpointz]
  590.             mov cx,word ptr ds:[bx+4]       ;cx=object.in.world.y
  591.             add cx,word ptr ds:[viewpointy]
  592.             mov si,word ptr ds:[bx+2]       ;si=object.in.world.x
  593.             add si,word ptr ds:[viewpointx]
  594.  
  595. wPHASE2:    mov ax,999
  596.             add ax,si
  597. wPHASE1:    mov dx,666
  598.             add dx,cx
  599.             imul dx
  600.             mov bl,ah
  601.             mov bh,dl
  602.             sub bx,di
  603. wPHASE3:    mov ax,666;word ptr cs:[r13]
  604.             imul bp
  605.             mov al,ah
  606.             mov ah,dl
  607.             add ax,bx
  608. wCP1:       sub ax,666
  609.             mov word ptr ds:[WXA+1],ax
  610. wPHASE5:    mov ax,999;word ptr cs:[r12]
  611.             add ax,si                  ;X+A
  612. wPHASE4:    mov dx,666;word ptr cs:[r11]   ;Y+B
  613.             add dx,cx
  614.             imul dx                    ;(X+A)*(Y+B)
  615.             mov bl,ah
  616.             mov bh,dl
  617.             sub bx,di                  ;vertex.xy
  618. wPHASE6:    mov ax,666;word ptr cs:[r13]
  619.             imul bp
  620.             mov al,ah
  621.             mov ah,dl
  622. wCP2:       sub ax,666
  623.             add ax,bx
  624.             mov word ptr ds:[WYA+1],ax
  625. wPHASE8:    mov ax,999;word ptr cs:[r12]
  626.             add ax,si
  627. wPHASE7:    mov dx,666;word ptr cs:[r11]
  628.             add dx,cx
  629.             imul dx
  630.             mov bl,ah
  631.             mov bh,dl
  632.             sub bx,di
  633. wPHASE9:    mov ax,666;word ptr cs:[r13]
  634.             imul bp
  635.             mov al,ah
  636.             mov ah,dl
  637. wCP3:       sub ax,666
  638.             add ax,bx
  639.             mov dx,ax
  640.             mov bx,word ptr ds:[swap]
  641.             mov cx,bx
  642.             shl bx,5
  643.             add bx,offset world+18
  644.             mov ax,word ptr ds:[cameraxpos]
  645. WXA:        add ax,6666
  646.             mov word ptr ds:[bx+2],ax
  647.             mov ax,word ptr ds:[cameraypos]
  648. WYA:        add ax,7777
  649.             mov word ptr ds:[bx+4],ax
  650.             mov ax,word ptr ds:[camerazpos]
  651.             add ax,dx
  652.             mov word ptr ds:[bx+6],ax
  653.             mov bx,cx
  654.             add bx,bx
  655.             add bx,bx
  656.             add bx,offset sortti2
  657.             mov word ptr ds:[bx],ax   ;object z      to sort table
  658.             mov word ptr ds:[bx+2],cx ;object number to sort table
  659.             ret
  660. ;--------------------------------------------------------------------
  661. setobject:
  662.             push cs
  663.             pop ds
  664.             mov si,word ptr ds:[swap]  ;object number
  665.             add si,si
  666.             add si,si
  667.             mov bx,word ptr ds:[sortti2+si+2]
  668.             shl bx,5
  669.             movzx ax,byte ptr ds:[world+2+bx] ;object type
  670.             mov word ptr ds:[tempobj],ax      ;save the type for later use
  671.             mov si,ax
  672.             add si,si
  673.             add si,si
  674.             mov eax,dword ptr ds:[elementxms+si]
  675.             mov dword ptr ds:[objectxms],eax
  676.             mov eax,dword ptr ds:[elementenvxms+si]
  677.             mov dword ptr ds:[envbufxms],eax
  678.             add bx,offset world+18 ;BX is now pointer to current object
  679.             mov ax,word ptr ds:[bx+2]      ;objectxpos
  680.             mov word ptr ds:[WX+1],ax
  681.             mov ax,word ptr ds:[bx+4]      ;objectypos
  682.             mov word ptr ds:[WY+1],ax
  683.             mov ax,word ptr ds:[bx+6]      ;objectzpos
  684.             mov word ptr ds:[WZ+1],ax
  685.             mov ax,word ptr ds:[bx+10]     ;objectxangle
  686.             mov word ptr ds:[TAX+1],ax
  687.             mov ax,word ptr ds:[bx+12]     ;objectyangle
  688.             mov word ptr ds:[TAY+1],ax
  689.             mov ax,word ptr ds:[bx+14]     ;objectzangle
  690.             mov word ptr ds:[TAZ+1],ax
  691.             ret
  692. ;---------------------------------------------------------------------
  693. updateworld:
  694.                push cs
  695.                pop ds
  696.                mov di,word ptr ds:[frame]
  697.                mov ax,12                        ;6 words per frame
  698.                mul di
  699.                mov bx,ax
  700.                mov ax,word ptr ds:[path+bx]
  701.                mov word ptr ds:[worldxangle],ax
  702.                mov ax,word ptr ds:[path+bx+2]
  703.                mov word ptr ds:[worldyangle],ax
  704.                mov ax,word ptr ds:[path+bx+4]
  705.                mov word ptr ds:[worldzangle],ax
  706.                mov ax,word ptr ds:[path+bx+6]
  707.                mov word ptr ds:[cameraxpos],ax
  708.                mov ax,word ptr ds:[path+bx+8]
  709.                mov word ptr ds:[cameraypos],ax  ;faster transfer
  710.                mov ax,word ptr ds:[path+bx+10]  ;later...
  711.                mov word ptr ds:[camerazpos],ax
  712.                ret
  713.  
  714. ;---------------------------------------------------------------------------
  715. umorp:        push cs                        ;simple morph adders
  716.               pop ds
  717.               mov ax,word ptr ds:[madd]
  718.               add word ptr ds:[mframe],ax
  719.               cmp word ptr ds:[mframe],260
  720.               jne @QUIT1
  721.               mov word ptr ds:[madd],-4
  722.               mov word ptr ds:[mframe],252
  723.               @QUIT1:
  724.               cmp word ptr ds:[mframe],-4
  725.               jne @QUIT2
  726.               mov word ptr ds:[mframe],4
  727.               mov word ptr ds:[madd],4
  728.               @QUIT2:
  729.               ret
  730. ;---------------------------------------------------------------------------
  731. morph:                                          ;not optimized
  732.             mov ax,0
  733.             mov ds,ax
  734.             mov bx,word ptr cs:[transformers]
  735.             add bx,bx
  736.             add bx,bx
  737.             mov esi,dword ptr cs:[elementxms+bx]  ;pointer to element
  738.             movzx eax,word ptr ds:[esi]           ;face amount
  739.             movzx edx,word ptr ds:[esi+2]         ;vertex amount
  740.             shl eax,5
  741.             add eax,4
  742.             add esi,eax                   ;esi=ptr to dest object
  743.             mov ecx,eax
  744.             shl edx,3
  745.             add edx,esi                   ;edx is=end ptr to object dest
  746.             mov dword ptr cs:[modi+3],edx
  747.  
  748.             mov bx,word ptr cs:[transformers+2]
  749.             add bx,bx
  750.             add bx,bx
  751.             mov ebp,dword ptr cs:[elementxms+bx]  ;pointer to element
  752.  
  753.             mov bx,word ptr cs:[transformers+4]
  754.             add bx,bx
  755.             add bx,bx
  756.             mov eax,dword ptr cs:[elementxms+bx]  ;pointer to element
  757.             sub eax,ebp
  758.             mov dword ptr cs:[SR2+3],eax
  759.             mov dword ptr cs:[SR3+3],eax
  760.             mov dword ptr cs:[SR4+3],eax
  761.             add ebp,ecx
  762.             mov di,word ptr cs:[mframe]  ;di=frame for ob1
  763.             mov cx,256
  764.             sub cx,di                    ;cx=frame for ob2
  765.             xchg ebp,esi
  766. @MP:
  767.             mov ax,word ptr ds:[esi]
  768.             imul cx
  769.             mov bh,dl
  770.             mov bl,ah
  771. SR2:        mov ax,word ptr ds:[esi+44332211h]
  772.             imul di
  773.             mov al,ah
  774.             mov ah,dl
  775.             add ax,bx
  776.             mov word ptr ds:[ebp],ax       ;new x
  777.             push ax
  778.             add ebp,2
  779.             add esi,2
  780.             mov ax,word ptr ds:[esi]
  781.             imul cx
  782.             mov bh,dl
  783.             mov bl,ah
  784. SR3:        mov ax,word ptr ds:[esi+44332211h]
  785.             imul di
  786.             mov al,ah
  787.             mov ah,dl
  788.             add ax,bx
  789.             mov word ptr ds:[ebp],ax       ;new y
  790.             push ax
  791.             add ebp,2
  792.             add esi,2
  793.             mov ax,word ptr ds:[esi]
  794.             imul cx
  795.             mov bh,dl
  796.             mov bl,ah
  797. SR4:        mov ax,word ptr ds:[esi+44332211h]
  798.             imul di
  799.             mov al,ah
  800.             mov ah,dl
  801.             add ax,bx
  802.             mov word ptr ds:[ebp],ax       ;new z
  803.             add ebp,2
  804.             add esi,2
  805.             pop ax
  806.             pop dx
  807.             imul dx
  808.             mov al,ah
  809.             mov ah,dl
  810.             mov word ptr ds:[ebp],ax
  811.             add ebp,2
  812.             add esi,2
  813. MODI:       cmp ebp,44332211h   ;for perfect morph we should
  814.             jne @MP             ;recalculate also normals
  815.            ret                  ;Just a vertex morph.....
  816.  
  817.  
  818. ;------------------------------------------------------------------
  819. rotate:      push cs
  820.              pop ds
  821.              xor ax,ax
  822.              mov es,ax
  823.  
  824. TAX:        mov bx,4545      ;start matrix calculation
  825. TAY:        mov si,4545
  826. TAZ:        mov di,4545
  827.             add bx,bx
  828.             add si,si
  829.             add di,di
  830.             mov bp,word ptr ds:[sine+bx]
  831.             mov bx,word ptr ds:[cose+bx]
  832.             mov ax,word ptr ds:[cose+si]
  833.             mov word ptr ds:[coy],ax
  834.             mov si,word ptr ds:[sine+si]
  835.             mov ax,word ptr ds:[sine+di]
  836.             mov word ptr ds:[siz],ax
  837.             mov di,word ptr ds:[cose+di]
  838.             mov ax,word ptr ds:[coy]
  839.             imul di
  840.             mov al,ah
  841.             mov ah,dl
  842.             mov word ptr ds:[phase1+1],ax
  843.             mov word ptr ds:[vrphase1+1],ax
  844.             mov word ptr ds:[vrphase1b+1],ax
  845.             mov word ptr ds:[vrphase1c+1],ax
  846.             mov ax,si
  847.             imul di
  848.             mov al,ah
  849.             mov ah,dl
  850.             imul bp
  851.             mov cl,ah
  852.             mov ch,dl
  853.             mov ax,word ptr ds:[siz]
  854.             imul bx
  855.             mov al,ah
  856.             mov ah,dl
  857.             add ax,cx
  858.             mov word ptr ds:[phase2+1],ax
  859.             mov word ptr ds:[vrphase2+1],ax
  860.             mov word ptr ds:[vrphase2b+1],ax
  861.             mov word ptr ds:[vrphase2c+1],ax
  862.             mov ax,si
  863.             imul di
  864.             mov al,ah
  865.             mov ah,dl
  866.             imul bx
  867.             mov cl,ah
  868.             mov ch,dl
  869.             mov ax,word ptr ds:[siz]
  870.             imul bp
  871.             mov al,ah
  872.             mov ah,dl
  873.             sub ax,cx
  874.             mov word ptr ds:[phase3+1],ax
  875.             mov word ptr ds:[vrphase3+1],ax
  876.             mov word ptr ds:[vrphase3b+1],ax
  877.             mov word ptr ds:[vrphase3c+1],ax
  878.  
  879.             mov ax,word ptr ds:[siz]
  880.             neg ax
  881.             imul word ptr ds:[coy]
  882.             mov al,ah
  883.             mov ah,dl
  884.             mov word ptr ds:[phase4+1],ax
  885.             mov word ptr ds:[vrphase4+1],ax
  886.             mov word ptr ds:[vrphase4b+1],ax
  887.             mov word ptr ds:[vrphase4c+1],ax
  888.  
  889.             mov ax,word ptr ds:[siz]
  890.             imul si
  891.             mov al,ah
  892.             mov ah,dl
  893.             imul bp
  894.             mov cl,ah
  895.             mov ch,dl
  896.             mov ax,bx
  897.             imul di
  898.             mov al,ah
  899.             mov ah,dl
  900.             sub ax,cx
  901.             mov word ptr ds:[phase5+1],ax
  902.             mov word ptr ds:[vrphase5+1],ax
  903.             mov word ptr ds:[vrphase5b+1],ax
  904.             mov word ptr ds:[vrphase5c+1],ax
  905.  
  906.             mov ax,word ptr ds:[siz]
  907.             imul si
  908.             mov al,ah
  909.             mov ah,dl
  910.             imul bx
  911.             mov al,ah
  912.             mov ah,dl
  913.             mov cx,ax
  914.             mov ax,bp
  915.             imul di
  916.             mov al,ah
  917.             mov ah,dl
  918.             add ax,cx
  919.             mov word ptr ds:[phase6+1],ax
  920.             mov word ptr ds:[vrphase6+1],ax
  921.             mov word ptr ds:[vrphase6b+1],ax
  922.             mov word ptr ds:[vrphase6c+1],ax
  923.  
  924.             mov ax,si
  925.             mov word ptr ds:[phase7+1],ax
  926.             mov word ptr ds:[lbl1+2],ax
  927.             mov ax,word ptr ds:[coy]
  928.             neg ax
  929.             imul bp
  930.             mov al,ah
  931.             mov ah,dl
  932.             mov word ptr ds:[phase8+1],ax
  933.             mov word ptr ds:[lbl2+1],ax
  934.             mov ax,word ptr ds:[coy]
  935.             imul bx
  936.             mov al,ah
  937.             mov ah,dl
  938.             mov word ptr ds:[phase9+1],ax     ;matrix is calculated now
  939.             mov word ptr ds:[lbl3+1],ax
  940.             mov edi,dword ptr ds:[objectxms]  ;absolute ptr to obj.data in XMS
  941.             movzx eax,word ptr es:[edi]       ;face amount
  942.             shl eax,5
  943.             add eax,edi
  944.             add eax,4
  945.             mov dword ptr ds:[p0+3],eax        ;32bit offset is here added
  946.             add eax,2
  947.             mov dword ptr ds:[p2+3],eax
  948.             add eax,2
  949.             mov dword ptr ds:[p4+3],eax
  950.             add eax,2
  951.             mov dword ptr ds:[p9+3],eax
  952.             movzx eax,word ptr es:[edi+2]      ;vertex amount
  953.             shl eax,3
  954.             mov dword ptr ds:[offset comp+3],eax
  955.             mov ax,word ptr ds:[xpos2d]
  956.             mov word ptr ds:[xp+1],ax
  957.             mov ax,word ptr ds:[ypos2d]
  958.             mov word ptr ds:[yp+1],ax
  959.             mov ax,word ptr ds:[phase1+1]      ;constants
  960.             mov bx,word ptr ds:[phase2+1]      ;for 6-mul system
  961.             imul bx
  962.             mov al,ah
  963.             mov ah,dl
  964.             sub word ptr ds:[WX+1],ax
  965.             mov word ptr ds:[vrcp1+1],ax
  966.             mov word ptr ds:[vrcp1b+1],ax
  967.             mov word ptr ds:[vrcp1c+1],ax
  968.             mov ax,word ptr ds:[phase4+1]            ;constants
  969.             mov bx,word ptr ds:[phase5+1]            ;for 6-mul system
  970.             imul bx
  971.             mov al,ah
  972.             mov ah,dl
  973.             sub word ptr ds:[WY+1],ax
  974.             mov word ptr ds:[vrcp2+1],ax
  975.             mov word ptr ds:[vrcp2b+1],ax
  976.             mov word ptr ds:[vrcp2c+1],ax
  977.             mov ax,word ptr ds:[phase7+1]            ;constants
  978.             mov bx,word ptr ds:[phase8+1]            ;for 6-mul system
  979.             imul bx
  980.             mov al,ah
  981.             mov ah,dl
  982.             sub word ptr ds:[WZ+1],ax
  983.             mov word ptr ds:[hidden+2],ax
  984.             mov eax,dword ptr cs:[projectionbuffer] ;pointer to matrix
  985.             mov dword ptr ds:[putx+3],eax
  986.             add eax,2
  987.             mov dword ptr ds:[puty+3],eax
  988.             add eax,2
  989.             mov dword ptr ds:[putz+3],eax
  990.             xor edi,edi                  ;relative ptr to obj.vertex.data
  991.             mov ax,0
  992.             mov ds,ax
  993. RTMAIN:                               ;rotate & 2d transform
  994.                                       ;rotating all vertexes allways
  995.             push di                   ;is faster when not much hidden faces
  996.      P4:    mov bp,word ptr ds:[edi+44332211h]      ;bp=vertex.z
  997.      P2:    mov cx,word ptr ds:[edi+44332211h]      ;cx=vertex.y
  998.      P0:    mov si,word ptr ds:[edi+44332211h]      ;si=vertex.x
  999.      P9:    mov di,word ptr ds:[edi+44332211h]      ;fs=vertex.y
  1000.  
  1001. PHASE2:     mov ax,999
  1002.             add ax,si
  1003. PHASE1:     mov dx,666
  1004.             add dx,cx
  1005.             imul dx
  1006.             mov bl,ah
  1007.             mov bh,dl
  1008.             sub bx,di
  1009. PHASE3:     mov ax,666
  1010.             imul bp
  1011.             mov al,ah
  1012.             mov ah,dl
  1013.             add ax,bx
  1014. WX:         add ax,6666
  1015.             mov word ptr cs:[xmod+1],ax
  1016. PHASE5:     mov ax,999
  1017.             add ax,si
  1018. PHASE4:     mov dx,666
  1019.             add dx,cx
  1020.             imul dx
  1021.             mov bl,ah
  1022.             mov bh,dl
  1023.             sub bx,di
  1024. PHASE6:     mov ax,666
  1025.             imul bp
  1026.             mov al,ah
  1027.             mov ah,dl
  1028.             add ax,bx
  1029. WY:         add ax,6666
  1030.             mov word ptr cs:[res2+1],ax
  1031. PHASE8:     mov ax,999
  1032.             add ax,si
  1033. PHASE7:     mov dx,666
  1034.             add dx,cx
  1035.             imul dx
  1036.             mov bl,ah
  1037.             mov bh,dl
  1038.             sub bx,di
  1039. PHASE9:     mov ax,666;word ptr cs:[r13]
  1040.             imul bp
  1041.             mov al,ah
  1042.             mov ah,dl
  1043. WZ:         add ax,7777
  1044.             add bx,ax
  1045.             pop di
  1046. PUTZ:       mov word ptr ds:[edi+4+(44332211h)],bx
  1047.       XMOD: mov ax,9999
  1048.             cwd
  1049.             mov dl,ah
  1050.             mov ah,al
  1051.          ;   xor al,al   ;no need becoz 0..255 div 256+ is zero....bx>255
  1052.             idiv bx
  1053.       XP:   add ax,1995
  1054. PUTX:       mov word ptr ds:[edi+(44332211h)],ax
  1055.       RES2: mov ax,666
  1056.             cwd
  1057.             mov dl,ah
  1058.             mov ah,al
  1059.          ;   xor al,al   ;no need becoz 0..255 div 256+ is zero....bx>255
  1060.             idiv bx
  1061.         YP: add ax,653
  1062. PUTY:       mov word ptr ds:[edi+2+(44332211h)],ax
  1063.            SKIP:
  1064.             add edi,8      ;wasting memory one word/vertex for faster access
  1065.       COMP: cmp edi,44332211h
  1066.             jne RTMAIN
  1067.             ret
  1068.  
  1069. ;------------------------------------------------------------
  1070. environment:
  1071.               push gs
  1072.               push es
  1073.               push ds
  1074.               mov ax,0
  1075.               mov ds,ax
  1076.               xor ebp,ebp
  1077.               mov eax,dword ptr cs:[sorttixms]
  1078.               add eax,2
  1079.               mov dword ptr cs:[fc-4],eax
  1080.               mov eax,dword ptr cs:[envbufxms]
  1081.               mov dword ptr cs:[fc2c-4],eax
  1082.               mov dword ptr cs:[fc3c-4],eax
  1083.               mov dword ptr cs:[fc4c-4],eax
  1084.               add eax,2
  1085.               mov dword ptr cs:[fc2b-4],eax
  1086.               mov dword ptr cs:[fc3b-4],eax
  1087.               mov dword ptr cs:[fc4b-4],eax
  1088.               add eax,2
  1089.               mov dword ptr cs:[fc2a-4],eax
  1090.               mov dword ptr cs:[fc3a-4],eax
  1091.               mov dword ptr cs:[fc4a-4],eax
  1092.               add eax,2
  1093.               mov dword ptr cs:[fc2d-4],eax
  1094.               mov dword ptr cs:[fc3d-4],eax
  1095.               mov dword ptr cs:[fc4d-4],eax
  1096.  
  1097.               add dword ptr cs:[fc4c-4],16
  1098.               add dword ptr cs:[fc4b-4],16
  1099.               add dword ptr cs:[fc4a-4],16
  1100.               add dword ptr cs:[fc4d-4],16
  1101.               add dword ptr cs:[fc3c-4],8
  1102.               add dword ptr cs:[fc3b-4],8
  1103.               add dword ptr cs:[fc3a-4],8
  1104.               add dword ptr cs:[fc3d-4],8
  1105.  
  1106.               mov eax,dword ptr cs:[objectxms]
  1107.               add eax,16
  1108.               mov dword ptr cs:[fc3+3],eax
  1109.               mov ax,word ptr cs:[facecount]
  1110.               mov bp,ax
  1111.               dec bp
  1112.           ;    mov word ptr cs:[fc5+2],ax
  1113. @vrFACESLEFT:
  1114.               xor edi,edi
  1115.               mov di,word ptr ds:[ebp*4+11223344h]  ;get the face number
  1116.           fc: mov ebx,edi
  1117.               shl ebx,3
  1118.               lea ebx,[ebx*2+ebx]               ;multiply by 24
  1119.               shl edi,5                         ;32 bytes data per face
  1120.          fc3: add edi,11223344h
  1121.               push bp
  1122.               mov word ptr ds:[0],bx   ;
  1123.               push di                  ;who cares about int 0 vector...
  1124.                  mov di,word ptr ds:[ebx+11223344h]
  1125.         fc2a:    mov cx,word ptr ds:[ebx+11223344h]
  1126.         fc2b:    mov si,word ptr ds:[ebx+11223344h]
  1127.         fc2c:    mov bp,word ptr ds:[ebx+11223344h]
  1128.         fc2d:
  1129. vrPHASE2:   mov ax,999
  1130.             add ax,si
  1131. vrPHASE1:   mov dx,666
  1132.             add dx,cx
  1133.             imul dx
  1134.             mov bl,ah
  1135.             mov bh,dl
  1136.             sub bx,bp
  1137. vrPHASE3:   mov ax,666
  1138.             imul di
  1139.             mov al,ah
  1140.             mov ah,dl
  1141.             add ax,bx
  1142. vrCP1:      sub ax,666
  1143.             sar ax,1
  1144.             xor ah,ah
  1145.             mov dx,ax
  1146. vrPHASE5:   mov ax,999
  1147.             add ax,si
  1148.             mov si,dx
  1149. vrPHASE4:   mov dx,666
  1150.             add dx,cx
  1151.             imul dx
  1152.             mov bl,ah
  1153.             mov bh,dl
  1154.             sub bx,bp
  1155. vrPHASE6:   mov ax,666
  1156.             imul di
  1157.             mov al,ah
  1158.             mov ah,dl
  1159.             add ax,bx
  1160. vrCP2:      sub ax,666
  1161.             pop di
  1162.             shl ax,7     ;ah=(al sar 1).......
  1163.             xor al,al
  1164.             or  ax,si
  1165.             add ax,8080h
  1166.             mov word ptr ds:[edi],ax
  1167.             mov bx,word ptr ds:[0]
  1168.             push di
  1169.             mov di,word ptr ds:[ebx+11223344h]
  1170.       fc3a: mov cx,word ptr ds:[ebx+11223344h]
  1171.       fc3b: mov si,word ptr ds:[ebx+11223344h]
  1172.       fc3c: mov bp,word ptr ds:[ebx+11223344h]
  1173.       fc3d:
  1174.  
  1175. vrPHASE2b:  mov ax,999
  1176.             add ax,si
  1177. vrPHASE1b:  mov dx,666
  1178.             add dx,cx
  1179.             imul dx
  1180.             mov bl,ah
  1181.             mov bh,dl
  1182.             sub bx,bp
  1183. vrPHASE3b:  mov ax,666
  1184.             imul di
  1185.             mov al,ah
  1186.             mov ah,dl
  1187.             add ax,bx
  1188. vrCP1b:     sub ax,666
  1189.             sar ax,1
  1190.             xor ah,ah
  1191.             mov dx,ax
  1192. vrPHASE5b:  mov ax,999
  1193.             add ax,si
  1194.             mov si,dx
  1195. vrPHASE4b:  mov dx,666
  1196.             add dx,cx
  1197.             imul dx
  1198.             mov bl,ah
  1199.             mov bh,dl
  1200.             sub bx,bp
  1201. vrPHASE6b:  mov ax,666
  1202.             imul di
  1203.             mov al,ah
  1204.             mov ah,dl
  1205.             add ax,bx
  1206. vrCP2b:     sub ax,666
  1207.             pop di
  1208.             shl ax,7
  1209.             xor al,al
  1210.             or  ax,si
  1211.             add ax,8080h
  1212.             mov word ptr ds:[edi+2],ax
  1213.             mov bx,word ptr ds:[0]
  1214.             push di
  1215.              mov di,word ptr ds:[ebx+11223344h]
  1216.        fc4a: mov cx,word ptr ds:[ebx+11223344h]
  1217.        fc4b: mov si,word ptr ds:[ebx+11223344h]
  1218.        fc4c: mov bp,word ptr ds:[ebx+11223344h]
  1219.        fc4d:
  1220.  
  1221. vrPHASE2c:  mov ax,999
  1222.             add ax,si
  1223. vrPHASE1c:  mov dx,666
  1224.             add dx,cx
  1225.             imul dx
  1226.             mov bl,ah
  1227.             mov bh,dl
  1228.             sub bx,bp
  1229. vrPHASE3c:  mov ax,666
  1230.             imul di
  1231.             mov al,ah
  1232.             mov ah,dl
  1233.             add ax,bx
  1234. vrCP1c:     sub ax,666
  1235.             sar ax,1
  1236.             xor ah,ah
  1237.             mov dx,ax
  1238. vrPHASE5c:  mov ax,999
  1239.             add ax,si
  1240.             mov si,dx
  1241. vrPHASE4c:  mov dx,666
  1242.             add dx,cx
  1243.             imul dx
  1244.             mov bl,ah
  1245.             mov bh,dl
  1246.             sub bx,bp
  1247. vrPHASE6c:  mov ax,666
  1248.             imul di
  1249.             mov al,ah
  1250.             mov ah,dl
  1251.             add ax,bx
  1252. vrCP2c:     sub ax,666
  1253.             pop di
  1254.             shl ax,7
  1255.             xor al,al
  1256.             or  ax,si
  1257.             add ax,8080h
  1258.             mov word ptr ds:[edi+4],ax         ;14
  1259.             pop bp
  1260.             sub bp,1
  1261.             jnc @vrFACESLEFT
  1262.             pop ds
  1263.             pop es
  1264.             pop gs
  1265.             ret
  1266. ; ---------------------------------------------------------------
  1267. RETRACE:
  1268.                 mov dx,3dah
  1269. AGAIN1:         in al,dx
  1270.                 and al,08h
  1271.                 jnz AGAIN1
  1272. AGAIN2:         in al,dx
  1273.                 and al,08h
  1274.                 jz AGAIN2
  1275.                 ret
  1276.  
  1277. ;-------------------------------------------------------------------
  1278. exit:
  1279.  
  1280.        push cs
  1281.        pop ds
  1282.        cmp byte ptr ds:[errr],2
  1283.        je @WASXMSerror
  1284.        cmp byte ptr ds:[errr],3
  1285.        je @WASXMSerror
  1286.        cmp byte ptr ds:[errr],7
  1287.        je @WASXMSerror
  1288.  
  1289.        call unlock
  1290.        call freexms
  1291.  @WASXMSerror:
  1292.        movzx dx,byte ptr ds:[errr]
  1293.        shl dx,4
  1294.        add dx,offset msg
  1295.        xor ax,ax
  1296.        mov ah,09h
  1297.        int 21h
  1298.        mov ax,4c00h
  1299.        int 21h
  1300. ;-------------------------------------------------------------------
  1301. copyright:
  1302.        push cs
  1303.        pop ds
  1304.        mov dx,offset title3
  1305.        xor ax,ax
  1306.        mov ah,09h
  1307.        int 21h
  1308.        mov dx,offset title2
  1309.        xor ax,ax
  1310.        mov ah,09h
  1311.        int 21h
  1312.        ret
  1313. ;--------------------------------------------------------------------
  1314. palette:
  1315.              push seg BACK     ;palette taken from background picture
  1316.              pop ds
  1317.              mov al,0
  1318.              mov dx,03c8h
  1319.              out dx,al
  1320.              mov si,0
  1321.              mov dx,03c9h
  1322. MAINL:
  1323.              mov al,byte ptr ds:[si+10]    ;phong.pal
  1324.              out dx,al
  1325.              mov al,byte ptr ds:[si+1+10]
  1326.              out dx,al
  1327.              mov al,byte ptr ds:[si+2+10]
  1328.              out dx,al
  1329.              add si,3
  1330.              cmp si,768
  1331.              jne MAINL
  1332.              ret
  1333. ;-------------------------------------------------------------------
  1334. flips:
  1335.              push 0a000h
  1336.              pop es
  1337.              xor di,di
  1338.              push seg loadbuffer
  1339.              pop ds
  1340.              push seg back
  1341.              pop gs
  1342.              xor eax,eax
  1343.              mov si,64000-320
  1344.              LI:
  1345.              mov dword ptr ds:[si],eax  ;clean garbage....
  1346.              add si,4
  1347.              cmp si,64000
  1348.              jne LI
  1349.              xor EBX,ebx
  1350.              OL:
  1351.              rept 160
  1352.              mov eax,dword ptr ds:[di]
  1353.              mov es:[di],eax
  1354.              mov eax,gs:[di]       ;the background
  1355.              mov ds:[di],eax
  1356.              add di,4
  1357.              endm
  1358.              cmp di,64000
  1359.              jne OL
  1360.              ret
  1361.  
  1362. ;------------------------------------------------------------------------
  1363. initsortbuffer:
  1364.                 mov ebp,dword ptr cs:[projectionbuffer]
  1365.                 mov ax,0
  1366.                 mov ds,ax
  1367.                 mov word ptr cs:[facecount],0
  1368.                 xor cx,cx
  1369.                 mov edi,dword ptr cs:[sorttixms]
  1370.                 add ebp,4
  1371.                 mov dword ptr cs:[muu1-4],ebp
  1372.                 mov dword ptr cs:[muu2-4],ebp
  1373.                 mov dword ptr cs:[muu3-4],ebp
  1374.                 xor ebx,ebx
  1375.                 mov esi,dword ptr cs:[objectxms]
  1376.                 mov cx,word ptr ds:[esi]  ;face count
  1377.                 dec cx
  1378.                 add esi,4                 ;pointer to face begin of data
  1379.                 xor bp,bp
  1380. INITL:
  1381.             mov ax,word ptr ds:[esi+6]
  1382. LBL2:       add ax,6666
  1383.             mov dx,word ptr ds:[esi+8]
  1384. LBL1:       add dx,7777
  1385.             imul dx
  1386.             mov bl,ah
  1387.             mov bh,dl
  1388.             sub bx,word ptr ds:[esi+12+(3*6)]     ;facenormal.xy, weird stored.
  1389. HIDDEN:     sub bx,666
  1390. LBL3:       mov ax,666
  1391.             imul word ptr ds:[esi+10]
  1392.             mov al,ah
  1393.             mov ah,dl
  1394.             add ax,bx
  1395.             njs zCLIPPEDorHIDDEN
  1396.         ;    cmp ax,0     ;hidden face remove angle, adjust this, if bugs
  1397.         ;    njng zCLIPPEDorHIDDEN
  1398.                 mov bx,word ptr ds:[esi]
  1399.                 mov dx,word ptr ds:[ebx*8+11223344h] ;rotated z
  1400.            MUU1:
  1401.                 mov bx,word ptr ds:[esi+2]
  1402.                 add dx,word ptr ds:[ebx*8+11223344h] ;rotated z
  1403.            MUU2:
  1404.                 mov bx,word ptr ds:[esi+4]
  1405.                 add dx,word ptr ds:[ebx*8+11223344h]   ;rotated z
  1406.            MUU3:mov word ptr ds:[edi],dx     ;first the z
  1407.                 mov word ptr ds:[edi+2],bp   ;then the face number
  1408.                 add edi,4
  1409.        ZCLIPPEDorHIDDEN:
  1410.                 add esi,32
  1411.                 inc bp
  1412.                 sub cx,1
  1413.                 jnc INITL
  1414.                 sub edi,cs:[sorttixms]
  1415.                 shr edi,2
  1416.                 mov word ptr cs:[facecount],di
  1417.                 ret
  1418. ;------------------------------------------------------------------------
  1419. align 2
  1420. count dw 260 dup (0)
  1421. bytesort:                        ;byte sort for faces....
  1422.          push cs
  1423.          pop ds
  1424.          xor eax,eax
  1425.          OFF=0
  1426.          rept 129
  1427.          mov dword ptr ds:[offset count+OFF],eax
  1428.          OFF=OFF+4
  1429.          endm
  1430.          xor ax,ax
  1431.          mov ds,ax
  1432.          mov eax,dword ptr cs:[sorttixms]
  1433.          mov dword ptr cs:[indexinxms],eax
  1434.          mov eax,dword ptr cs:[onearrayxms]
  1435.          mov dword ptr cs:[indexoutxms],eax
  1436.          mov ax,word ptr cs:[facecount]
  1437.          mov word ptr cs:[itemcount],ax
  1438.          mov word ptr cs:[bytenumber],0
  1439.          mov esi,dword ptr cs:[indexinxms]
  1440.          mov dx,0
  1441.          mov cx,word ptr cs:[itemcount]
  1442.          @bloop:
  1443.          mov bl,byte ptr ds:[esi]
  1444.          xor bh,bh
  1445.          inc bx
  1446.          add bx,bx
  1447.          inc word ptr cs:[bx+count]
  1448.          add esi,4
  1449.          sub cx,1
  1450.          jnc @bloop
  1451.          mov bx,offset count
  1452.          push ds
  1453.          push cs
  1454.          pop ds
  1455.          @cloop:
  1456.          mov ax,word ptr ds:[bx]
  1457.          add bx,2
  1458.          add word ptr ds:[bx],ax
  1459.          cmp bx,510 +offset count
  1460.          jna @cloop
  1461.          pop ds
  1462.          xor dx,dx
  1463.          xor ebx,ebx
  1464.          xor ecx,ecx
  1465.          mov edi,dword ptr cs:[indexinxms]
  1466.          mov eax,dword ptr cs:[indexoutxms]
  1467.          mov dword ptr cs:[sf2-4],eax
  1468.          mov bp,word ptr cs:[facecount]
  1469.          xor esi,esi
  1470.          @dloop:
  1471.          mov eax,dword ptr ds:[edi]
  1472.          mov bx,ax
  1473.          xor bh,bh
  1474.          add bx,bx
  1475.          mov si,word ptr cs:[bx+count]
  1476.          mov dword ptr ds:[esi*4+11223344h],eax
  1477.     SF2: inc word ptr cs:[bx+count]
  1478.          add edi,4
  1479.          sub bp,1
  1480.          jnc @dloop
  1481.          push cs
  1482.          pop ds
  1483.          xor eax,eax
  1484.          OFF=0
  1485.          rept 129
  1486.          mov dword ptr ds:[offset count+OFF],eax
  1487.          OFF=OFF+4
  1488.          endm
  1489.          mov eax,dword ptr cs:[onearrayxms]
  1490.          mov dword ptr cs:[indexinxms],eax
  1491.          mov eax,dword ptr cs:[sorttixms]
  1492.          mov dword ptr cs:[indexoutxms],eax
  1493.          mov ax,word ptr cs:[facecount]
  1494.          mov word ptr cs:[itemcount],ax
  1495.          mov word ptr cs:[bytenumber],8
  1496.          xor ax,ax
  1497.          mov ds,ax
  1498.          mov esi,dword ptr cs:[indexinxms]
  1499.          inc esi
  1500.          mov dx,0
  1501.          mov cx,word ptr cs:[itemcount]
  1502.          p@bloop:
  1503.          mov bl,byte ptr ds:[esi]
  1504.          xor bh,bh
  1505.          inc bx
  1506.          add bx,bx
  1507.          inc word ptr cs:[bx+count]
  1508.          add esi,4
  1509.          sub cx,1
  1510.          jnc p@bloop
  1511.  
  1512.         mov bx,offset count
  1513.         push ds
  1514.         push cs
  1515.         pop ds
  1516.         p@cloop:
  1517.         mov ax,word ptr ds:[bx]
  1518.         add bx,2
  1519.         add word ptr ds:[bx],ax
  1520.         cmp bx,510 +offset count
  1521.         jna p@cloop
  1522.         pop ds
  1523.         mov dx,0
  1524.         xor ebx,ebx
  1525.         xor ecx,ecx
  1526.         mov edi,dword ptr cs:[indexinxms]
  1527.         mov eax,dword ptr cs:[indexoutxms]
  1528.         mov dword ptr cs:[sf3-4],eax
  1529.         mov bp,word ptr cs:[facecount]
  1530.         xor esi,esi
  1531.         p@dloop:
  1532.         mov eax,dword ptr ds:[edi]
  1533.         mov bl,ah
  1534.         xor bh,bh
  1535.         add bx,bx
  1536.         mov si,word ptr cs:[bx+count]
  1537.         mov dword ptr ds:[esi*4+11223344h],eax
  1538.    SF3: inc word ptr cs:[bx+count]
  1539.         add edi,4
  1540.         sub bp,1
  1541.         jnc p@dloop
  1542.         ret
  1543. ;----------------------------------------------------------------------------
  1544. sortobjects:                               ;bitsort for objects....
  1545.                 push es                    ;lazyness.....
  1546.                 push ds
  1547.                 push cs
  1548.                 pop ds
  1549.                 mov     ax,ds
  1550.                 mov     es,ax
  1551.                 cld
  1552.                 mov     dx,word ptr ds:[world]
  1553.                 shl     dx,2
  1554.                 add     dx,offset sortti2
  1555.         XOR    AX,AX
  1556.         MOV    byte ptr ds:[fcount],0
  1557.                 mov     bp,1
  1558. o@outloop:
  1559.                 mov     si,offset sortti2
  1560.                 mov     di,offset onearray2
  1561.                 mov     bx,offset zeroarray2
  1562.  
  1563. o@iloop:
  1564.         MOV    EAX,dword ptr ds:[SI]
  1565.         test    AX,bp
  1566.         JE    o@zeros
  1567.         MOV    dword ptr ds:[di],EAX
  1568.                 add     di,4
  1569.                 add     si,4
  1570.                 cmp     si,dx
  1571.                 jne     o@iloop
  1572.         JMP    oPdASS
  1573. o@zeros:
  1574.         MOV    dword ptr ds:[bx],eax
  1575.                 add     bx,4
  1576.                 add     si,4
  1577.         CMP    si,dx
  1578.                 jne o@iloop
  1579. oPdASS:
  1580.                 mov     cx,di
  1581.                 sub     cx,offset onearray2
  1582.                 shr     cx,2
  1583.                 mov     si,offset onearray2
  1584.                 mov     di,offset sortti2
  1585.                 o@okc:
  1586.                 or cx,cx
  1587.                 jz oNOTHISTIME
  1588.                 oalfa:
  1589.                 mov eax,dword ptr ds:[si]
  1590.                 mov dword ptr ds:[di],eax
  1591.                 add di,4
  1592.                 add si,4
  1593.                 dec cx
  1594.                 jnz oalfa
  1595.                 oNOTHISTIME:
  1596.                 mov     si,offset zeroarray2
  1597.                 mov     cx,bx
  1598.                 sub     cx,offset zeroarray2
  1599.                 shr     cx,2
  1600.                 or cx,cx
  1601.                 jz oNOTHISTIME2
  1602.                 oalfa2:
  1603.                 mov eax,dword ptr ds:[si]
  1604.                 mov dword ptr ds:[di],eax
  1605.                 add di,4
  1606.                 add si,4
  1607.                 dec cx
  1608.                 jnz oalfa2
  1609.                 oNOTHISTIME2:
  1610.         add    bp,bp
  1611.         inc    byte ptr ds:[fcount]
  1612.         CMP    byte ptr ds:[fcount],0FH
  1613.         Jng    o@outloop
  1614.                 pop ds
  1615.                 pop es
  1616.                 ret
  1617.  
  1618. ;---------------------------------------------------------------------------
  1619. prefix:
  1620.                mov word ptr cs:[swap],0
  1621.                mov eax,dword ptr cs:[envbufxms]
  1622.                mov dword ptr cs:[lastxms],eax
  1623.      MORETOFIX:
  1624.                push ds
  1625.                xor ax,ax
  1626.                mov ds,ax
  1627.                mov di,word ptr cs:[swap]
  1628.                add di,di
  1629.                add di,di
  1630.                mov esi,dword ptr cs:[elementxms+di]
  1631.                mov dword ptr cs:[objectxms],esi
  1632.                mov bp,word ptr ds:[esi]   ;bp=face amount
  1633.                mov ax,24                  ;24 bytes in env map per face
  1634.                mul bp
  1635.                movzx eax,ax
  1636.                add esi,4
  1637.                xor cx,cx
  1638.                mov ebx,dword ptr cs:[lastxms]
  1639.                mov dword ptr cs:[elementenvxms+di],ebx
  1640.                add dword ptr cs:[lastxms],eax
  1641.                MULL:
  1642.                mov ax,word ptr ds:[esi+6] ;face.normal.x
  1643.                mov di,word ptr ds:[esi+8] ;face.normal.y
  1644.                imul di
  1645.                mov al,ah
  1646.                mov ah,dl
  1647.                mov word ptr ds:[esi+12+(3*6)],ax
  1648.  
  1649.                mov ax,word ptr ds:[esi+16] ;vertex1.normal.z
  1650.                sar word ptr ds:[esi+16],1
  1651.                add word ptr ds:[esi+16],128
  1652.                mov word ptr ds:[ebx+4],ax
  1653.                mov ax,word ptr ds:[esi+12] ;vertex1.normal.x
  1654.                sar word ptr ds:[esi+12],1
  1655.                add word ptr ds:[esi+12],128
  1656.                mov word ptr ds:[ebx],ax
  1657.                mov di,word ptr ds:[esi+14] ;vertex1.normal.y
  1658.                sar word ptr ds:[esi+14],1
  1659.                add word ptr ds:[esi+14],128
  1660.                mov word ptr ds:[ebx+2],di
  1661.                imul di
  1662.                mov al,ah
  1663.                mov ah,dl
  1664.                mov word ptr ds:[ebx+6],ax
  1665.                add ebx,8
  1666.                mov ax,word ptr ds:[esi+22] ;vertex2.normal.z
  1667.                sar word ptr ds:[esi+22],1
  1668.                add word ptr ds:[esi+22],128
  1669.                mov word ptr ds:[ebx+4],ax
  1670.                mov ax,word ptr ds:[esi+18] ;vertex2.normal.x
  1671.                sar word ptr ds:[esi+18],1
  1672.                add word ptr ds:[esi+18],128
  1673.                mov word ptr ds:[ebx],ax
  1674.                mov di,word ptr ds:[esi+20] ;vertex2.normal.y
  1675.                sar word ptr ds:[esi+20],1
  1676.                add word ptr ds:[esi+20],128
  1677.                mov word ptr ds:[ebx+2],di
  1678.                imul di
  1679.                mov al,ah
  1680.                mov ah,dl
  1681.                mov word ptr ds:[ebx+6],ax
  1682.                add ebx,8
  1683.                mov ax,word ptr ds:[esi+28] ;vertex3.normal.z
  1684.                sar word ptr ds:[esi+28],1
  1685.                add word ptr ds:[esi+28],128
  1686.                mov word ptr es:[ebx+4],ax
  1687.                mov ax,word ptr ds:[esi+24] ;vertex3.normal.x
  1688.                sar word ptr ds:[esi+24],1
  1689.                add word ptr ds:[esi+24],128
  1690.  
  1691.                mov word ptr ds:[ebx],ax
  1692.                mov di,word ptr ds:[esi+26] ;vertex3.normal.y
  1693.                sar word ptr ds:[esi+26],1
  1694.                add word ptr ds:[esi+26],128
  1695.                mov word ptr ds:[ebx+2],di
  1696.                imul di
  1697.                mov al,ah
  1698.                mov ah,dl
  1699.                mov word ptr ds:[ebx+6],ax
  1700.                add ebx,8
  1701.                add esi,32
  1702.                inc cx
  1703.                cmp cx,bp
  1704.                jne MULL
  1705.                movzx eax,bp       ;face amount
  1706.                shl eax,5          ;per each face is 32 bytes
  1707.                add eax,4
  1708.                mov esi,dword ptr cs:[objectxms]
  1709.                mov di,word ptr ds:[esi+2]  ;di=vertex amount
  1710.                add esi,eax                 ;esi = begin of vertex data
  1711.                VMULL:
  1712.                mov ax,word ptr ds:[esi]   ;vertex.x
  1713.                mov bx,word ptr ds:[esi+2] ;vertex.y
  1714.                imul bx
  1715.                mov al,ah
  1716.                mov ah,dl
  1717.                mov word ptr ds:[esi+6],ax ;vertex.xy,
  1718.                add esi,8                  ; the converter doesn't do it.
  1719.                dec di
  1720.                jnz VMULL
  1721.                pop ds
  1722.                inc word ptr cs:[swap]
  1723.                mov ax,word ptr cs:[elements]
  1724.                cmp word ptr cs:[swap],ax
  1725.                jne MORETOFIX
  1726.                ret
  1727.  
  1728. ;---------------------------------------------------------------------------
  1729. txdrawpolys:
  1730.             mov ax,seg material
  1731.             mov fs,ax
  1732.             xor ax,ax
  1733.             mov ds,ax
  1734.             mov ax,seg loadbuffer
  1735.             mov es,ax
  1736.             mov ecx,dword ptr cs:[sorttixms]
  1737.  
  1738.             mov dword ptr cs:[moo-4],ecx
  1739.             add dword ptr cs:[moo-4],2
  1740.             movzx eax,word ptr cs:[facecount]
  1741.             add eax,eax
  1742.             add eax,eax
  1743.             add ecx,eax
  1744.             sub ecx,4
  1745.             mov eax,dword ptr cs:[objectxms]
  1746.             add eax,16
  1747.             mov dword ptr cs:[mdr1+3],eax
  1748.             mov eax,dword ptr cs:[projectionbuffer]
  1749.             mov dword ptr cs:[mcr1-4],eax
  1750.             mov dword ptr cs:[mcr4-4],eax
  1751.             mov dword ptr cs:[mcr6-4],eax
  1752.             add eax,2
  1753.             mov dword ptr cs:[mcr2-4],eax
  1754.             mov dword ptr cs:[mcr5-4],eax
  1755.             mov dword ptr cs:[mcr3-4],eax
  1756.             xor edi,edi
  1757.             add ecx,2
  1758.             xor ebx,ebx
  1759.             xor edx,edx
  1760. txPLOOP:
  1761.             xor ax,ax
  1762.             mov ds,ax
  1763.             push cx
  1764.             xor esi,esi
  1765.             mov si,word ptr ds:[ecx]         ;get the facenumber
  1766.             mov al,byte ptr fs:[si]          ;get the material for face
  1767.             mov byte ptr cs:[colori-1],al
  1768.             shl esi,5
  1769.       mdr1: add esi,11223344h
  1770.             mov eax,dword ptr ds:[esi]
  1771.             mov dword ptr cs:[ux1],eax
  1772.             mov ax,word ptr ds:[esi+4]
  1773.             mov word ptr cs:[ux3],ax
  1774.             mov dx,word ptr ds:[esi-12]          ;pointer to vertex3
  1775.             mov bx,word ptr ds:[esi+2-12]        ;pointer to vertex1
  1776.             mov di,word ptr ds:[esi+4-12]        ;pointer to vertex2
  1777.             mov bp, word ptr ds:[edx*8+11223344h]     ;get the vertex1-x
  1778.  mcr6:      mov dx, word ptr ds:[edx*8+2+11223344h]   ;get the vertex1-y
  1779.  mcr5:      mov cx, word ptr ds:[edi*8+11223344h]     ;get the vertex3-x
  1780.  mcr4:      mov di, word ptr ds:[edi*8+2+11223344h]   ;get the vertex3-y
  1781.  mcr3:      mov si, word ptr ds:[ebx*8+2+11223344h]   ;get the vertex2-y
  1782.  mcr2:      mov bx, word ptr ds:[ebx*8+11223344h]     ;get the vertex2-x
  1783.  MCR1:      mov ax, cs
  1784.             mov ds, ax
  1785. ;--------------------------------------------------------------------------
  1786. ; 2D-TEXTURE MAPPING ROUTINE
  1787. ;-------------------------------------------------------------------------
  1788. texturepoly:
  1789. ;mov bp,word ptr ds:[tx1]
  1790. ;mov bx,word ptr ds:[tx2]
  1791. ;mov cx,word ptr ds:[tx3]
  1792. ;mov dx,word ptr ds:[ty1]
  1793. ;mov si,word ptr ds:[ty2]
  1794. ;mov di,word ptr ds:[ty3]
  1795. cmp dx,si
  1796. njne @NOSAME1
  1797. cmp dx,di
  1798. njne @NOSAME1
  1799. cmp si,di
  1800. fje AWAY
  1801. ;cmp bp,-512        ;boundary check removed
  1802. ;jng AWAY
  1803. ;cmp bx,-512
  1804. ;jng AWAY
  1805. ;cmp cx,-512
  1806. ;jng AWAY
  1807. ;cmp dx,-512
  1808. ;jng AWAY
  1809. ;cmp si,-512
  1810. ;jng AWAY
  1811. ;cmp di,-512
  1812. ;jng AWAY
  1813. ;cmp bp,511
  1814. ;jg AWAY
  1815. ;cmp bx,511
  1816. ;jg AWAY
  1817. ;cmp cx,511
  1818. ;jg AWAY
  1819. ;cmp dx,511
  1820. ;jg AWAY
  1821. ;cmp si,511
  1822. ;jg AWAY
  1823. ;cmp di,511
  1824. ;jg AWAY
  1825.  
  1826. @NOSAME1:
  1827. mov ax,bp
  1828. and ax,bx    ;out of screen check  (left)
  1829. and ax,cx
  1830. fjs AWAY
  1831. TPAS1:
  1832. cmp bp,319
  1833. njng TPAS2
  1834. cmp bx,319
  1835. njng TPAS2
  1836. cmp cx,319
  1837. fjg AWAY     ;out of screen check (right)
  1838. TPAS2:
  1839. mov ax,dx
  1840. and ax,si    ;out of screen check (up)
  1841. and ax,di
  1842. fjs AWAY
  1843. TPAS3:
  1844. cmp dx,199
  1845. njng TPAS4
  1846. cmp si,199
  1847. njng TPAS4
  1848. cmp di,199
  1849. fjg AWAY      ;out of screen check (down)
  1850. TPAS4:
  1851. cmp dx,si
  1852. njng EI1
  1853. xchg dx,si
  1854. xchg bp,bx
  1855. mov ax,word ptr ds:[ux2]
  1856. xchg ax,word ptr ds:[ux1]
  1857. mov word ptr ds:[ux2],ax
  1858. Ei1:
  1859. cmp dx,di
  1860. njng EI2
  1861. xchg dx,di
  1862. xchg bp,cx
  1863. mov ax,word ptr ds:[ux3]
  1864. xchg ax,word ptr ds:[ux1]
  1865. mov word ptr ds:[ux3],ax
  1866. Ei2:
  1867. cmp si,di
  1868. njng EI3
  1869. xchg si,di
  1870. xchg bx,cx
  1871. mov ax,word ptr ds:[ux3]
  1872. xchg ax,word ptr ds:[ux2]
  1873. mov word ptr ds:[ux3],ax
  1874. Ei3:
  1875. mov word ptr ds:[ttx1],bp
  1876. mov word ptr ds:[ttx2],bx
  1877. mov word ptr ds:[ttx3],cx
  1878. mov word ptr ds:[tty1],dx
  1879. mov word ptr ds:[tty2],si
  1880. mov word ptr ds:[tty3],di
  1881.  
  1882.   mov word ptr ds:[ys],dx
  1883.   cmp dx,-1
  1884.   njg @INSCREEN
  1885.   mov word ptr ds:[ys],0
  1886.   @INSCREEN:
  1887.   mov word ptr ds:[ye],di
  1888.   cmp di,199
  1889.   njng @INSCREEN2
  1890.   mov word ptr ds:[ye],199
  1891.   @INSCREEN2:
  1892. ;----------------------------------------------------------------------
  1893. ;Line 1 ->  Y1-Y3 left
  1894. ;----------------------------------------------------------------------
  1895. mov ax, bp
  1896. sub ax, cx
  1897. mov bx, dx
  1898. sub bx, di
  1899. dec bx
  1900. cwd
  1901. shl ax,6
  1902. idiv bx
  1903. mov si,ax
  1904. xor ah,ah
  1905. xor dh,dh
  1906. mov cx, word ptr ds:[ux1]
  1907. mov al,cl
  1908. mov dl, byte ptr ds:[ux3]
  1909. sub ax,dx
  1910. cwd
  1911. shl ax,7
  1912. idiv bx
  1913. add ax,ax
  1914. mov word ptr ds:[@f0+2],ax
  1915. xor ah,ah
  1916. xor dh,dh
  1917. mov al, byte ptr ds:[uy1]
  1918. mov dl, byte ptr ds:[uy3]
  1919. sub ax,dx
  1920. cwd
  1921. shl ax,7
  1922. idiv bx
  1923. mov dx,bp;word ptr ds:[ttx1]
  1924. shl dx,6
  1925. mov bp,ax
  1926. add bp,bp
  1927. mov di,word ptr ds:[ys]
  1928. add di,di
  1929. mov ax,word ptr ds:[ye]
  1930. add ax,ax
  1931. add ax,offset xleft
  1932. mov word ptr ds:[@COMP1+2],ax
  1933. mov bh,cl
  1934. xor bl,bl
  1935. xor cl,cl
  1936. add di,offset xleft
  1937.     cmp word ptr ds:[tty1],-1    ;bx=startu scaled by 2^8
  1938.     njg @EDGE1                   ;cx=startv scaled by 2^8
  1939.                                  ;dx=startx scaled by 2^6
  1940.     push dx
  1941.     mov ax,word ptr ds:[tty1]
  1942.     neg ax
  1943.     imul si                      ;-y1*xstep=x(0)
  1944.     pop dx
  1945.     add ax,dx                    ;+start x
  1946.     push ax
  1947.     mov ax,word ptr ds:[tty1]
  1948.     neg ax
  1949.     imul word ptr ds:[@F0+2]
  1950.     add bx,ax                    ;start u
  1951.     mov ax,word ptr ds:[tty1]
  1952.     neg ax
  1953.     imul bp
  1954.     add cx,ax                    ;start v
  1955.     pop dx                       ;start x
  1956.  
  1957. @EDGE1:
  1958.           mov ah,bh
  1959.           mov al,ch
  1960.           mov word ptr ds:[di+800],ax
  1961.           mov word ptr ds:[di],dx
  1962. @F0:      add bx,666;si      ;ustep
  1963.           add cx,bp          ;vstep
  1964.           add dx,si          ;xstep
  1965.           add di,2
  1966. @COMP1:   cmp di,666
  1967.           njb @EDGE1         ;jna
  1968. ;-------------------------------------------------------------------------
  1969. ;Line 2 ->  Y1-Y2 xright
  1970. ;-------------------------------------------------------------------------
  1971. mov ax, word ptr ds:[ttx1]
  1972. mov bp, ax
  1973. sub ax, word ptr ds:[ttx2]
  1974. mov bx, word ptr ds:[tty1]
  1975. mov di,bx
  1976. sub bx, word ptr ds:[tty2]
  1977. dec bx
  1978. cwd
  1979. shl ax,6
  1980. idiv bx
  1981. mov si,ax
  1982. xor ah,ah
  1983. xor dh,dh
  1984. mov cx, word ptr ds:[ux1]
  1985. mov al,cl
  1986. mov dl, byte ptr ds:[ux2]
  1987. sub ax,dx
  1988. cwd
  1989. shl ax,7
  1990. idiv bx
  1991. add ax,ax
  1992. mov word ptr ds:[f2+2],ax
  1993. xor dh,dh
  1994. xor ah,ah
  1995. mov al, byte ptr ds:[uy1]
  1996. mov dl, byte ptr ds:[uy2]
  1997. sub ax,dx
  1998. cwd
  1999. shl ax,7
  2000. idiv bx
  2001. mov dx,bp
  2002. shl dx,6
  2003. mov bp,ax
  2004. mov di,word ptr ds:[ys]
  2005. add di,di
  2006. mov ax,word ptr ds:[tty2]
  2007. cmp ax,-1
  2008. njg  normals
  2009. xor ax,ax
  2010. normals:
  2011. cmp ax,199
  2012. njng normals2
  2013. mov ax,199
  2014. normals2:
  2015. add ax,ax
  2016. add ax,offset xright
  2017. mov word ptr ds:[@COMP12+2],ax
  2018. mov bh,cl
  2019. xor bl,bl
  2020. xor cl,cl
  2021. add bp,bp
  2022. add di,offset xright
  2023.     cmp word ptr ds:[tty1],-1    ;bx=startu scaled by 2^8
  2024.     njg @EDGE12                  ;cx=startv scaled by 2^8
  2025.                                  ;dx=startx scaled by 2^6
  2026.     push dx
  2027.     mov ax,word ptr ds:[tty1]
  2028.     neg ax
  2029.     imul si                      ;-y1*xstep=x(0)
  2030.     pop dx
  2031.     add ax,dx                    ;+start x
  2032.     push ax
  2033.     mov ax,word ptr ds:[tty1]
  2034.     neg ax
  2035.     imul word ptr ds:[F2+2]
  2036.     add bx,ax                    ;start u
  2037.     mov ax,word ptr ds:[tty1]
  2038.     neg ax
  2039.     imul bp
  2040.     add cx,ax                    ;start v
  2041.     pop dx                       ;start x
  2042. @EDGE12:
  2043.           mov ah,bh
  2044.           mov al,ch
  2045.           mov word ptr ds:[di+800],ax
  2046.           mov word ptr ds:[di],dx
  2047. f2:       add bx,6666;si     ;ustep
  2048.           add cx,bp          ;vstep
  2049.           add dx,si          ;xstep
  2050.           add di,2
  2051. @COMP12:  cmp di,666
  2052.           njb @EDGE12
  2053. ;----------------------------------------------------------------------
  2054. ;Line 2 ->  Y2-Y3 xright
  2055. ;----------------------------------------------------------------------
  2056. mov ax, word ptr ds:[ttx2]
  2057. mov bp, ax
  2058. sub ax, word ptr ds:[ttx3]
  2059. mov bx, word ptr ds:[tty2]
  2060. mov di,bx
  2061. cmp di,-1
  2062. njg y2pos
  2063. xor di,di
  2064. y2pos:
  2065. cmp di,199
  2066. njng ypos3
  2067. mov di,199
  2068. ypos3:
  2069. sub bx, word ptr ds:[tty3]
  2070. dec bx
  2071. cwd
  2072. shl ax,6
  2073. idiv bx
  2074. mov si,ax
  2075. xor ah,ah
  2076. xor dh,dh
  2077. mov cx, word ptr ds:[ux2]
  2078. mov al,cl
  2079. mov dl, byte ptr ds:[ux3]
  2080. sub ax,dx
  2081. cwd
  2082. shl ax,7
  2083. idiv bx
  2084. add ax,ax
  2085. mov word ptr ds:[f3+2],ax
  2086. xor ah,ah
  2087. xor dh,dh
  2088. mov al, byte ptr ds:[uy2]
  2089. mov dl, byte ptr ds:[uy3]
  2090. sub ax,dx
  2091. cwd
  2092. shl ax,7
  2093. idiv bx
  2094. mov dx,bp
  2095. shl dx,6
  2096. mov bp,ax
  2097. add di,di
  2098. mov ax,word ptr ds:[ye]
  2099. add ax,ax
  2100. add ax,offset xright
  2101. mov word ptr ds:[@COMP123+2],ax
  2102. sub ax,offset xright-offset yadd
  2103. mov word ptr ds:[ENDLINE+2],ax
  2104. mov bh,cl
  2105. xor bl,bl
  2106. xor cl,cl
  2107. add bp,bp
  2108. add di,offset xright
  2109.  
  2110.     cmp word ptr ds:[tty2],-1    ;bx=startu scaled by 2^8
  2111.     njg @EDGE123                 ;cx=startv scaled by 2^8
  2112.                                  ;dx=startx scaled by 2^6
  2113.     push dx
  2114.     mov ax,word ptr ds:[tty2]
  2115.     neg ax
  2116.     imul si                      ;-y1*xstep=x(0)
  2117.     pop dx
  2118.     add ax,dx                    ;+start x
  2119.     push ax
  2120.     mov ax,word ptr ds:[tty2]
  2121.     neg ax
  2122.     imul word ptr ds:[F3+2]
  2123.     add bx,ax                    ;start u
  2124.     mov ax,word ptr ds:[tty2]
  2125.     neg ax
  2126.     imul bp
  2127.     add cx,ax                    ;start v
  2128.     pop dx                       ;start x
  2129.  
  2130. @EDGE123:
  2131.           mov ah,bh
  2132.           mov al,ch
  2133.           mov word ptr ds:[di+800],ax
  2134.           mov word ptr ds:[di],dx
  2135. f3:       add bx,5555            ;ustep
  2136.           add cx,bp              ;vstep
  2137.           add dx,si              ;xstep
  2138.           add di,2
  2139. @COMP123: cmp di,666
  2140.           njb @EDGE123           ;jna
  2141. ; ----------------------------------------------------------------------
  2142. ;  Draw texture polygon
  2143. ; -----------------------------------------------------------------------
  2144.           mov si,word ptr ds:[ys]
  2145.           add si,si
  2146.           add si,offset yadd
  2147.           mov ax,seg texture
  2148.           mov ds,ax
  2149.           @NEWLINES:
  2150.           push si
  2151.           mov di,word ptr cs:[si]       ;yadd
  2152.           mov cx,word ptr cs:[si+400]   ;xleft
  2153.           mov dx,word ptr cs:[si+800]   ;xright
  2154.           mov bp,word ptr cs:[si+1200]  ;textleft
  2155.           mov si,word ptr cs:[si+1600]  ;textright
  2156.           cmp dx,cx
  2157.           njng @NOCHANGE
  2158.           xchg cx,dx
  2159.           xchg bp,si
  2160.           @NOCHANGE:
  2161.           mov ax,bp
  2162.           mov al,ah
  2163.           xor ah,ah
  2164.           mov bx,si
  2165.           mov bl,bh
  2166.           xor bh,bh
  2167.           and bp,255
  2168.           and si,255
  2169.           sar cx,6       ;remove scaling
  2170.           sar dx,6       ;remove scaling
  2171.           cmp dx,319
  2172.           fjg @LINJA               ;if xstart>319 then skip
  2173.           mov word ptr cs:[xs],dx
  2174.           add di,dx
  2175.           cmp cx,-1
  2176.           fjng @LINJA              ;if xend<0 then skip
  2177.           mov word ptr cs:[xe],cx
  2178.           sub cx,dx
  2179.           inc cx                   ;cant be zero   ;cx=length of line
  2180.           xor dx,dx
  2181.           sub ax,bx
  2182.           sbb dx,0
  2183.           shl ax,7
  2184.           idiv cx                ;2 divs per scanline crap.......
  2185.           add ax,ax
  2186.           xor dx,dx
  2187.           sub bp,si
  2188.           sbb dx,0                 ;xor dx,dx + sbb dx,0 is faster than CWD...
  2189.           xchg ax,bp
  2190.           shl ax,7
  2191.           idiv cx
  2192.           add ax,ax
  2193.           xor dx,dx
  2194.           mov dh,bl
  2195.           shl si,8                 ;si=texture startu (y)
  2196.                                    ;dx=texture startv (x)
  2197.                                    ;bp=vstep, ax=ustep
  2198.           cmp word ptr cs:[xe],319
  2199.           njng @NORIGHTCLIP
  2200.           sub cx,word ptr cs:[xe]
  2201.           add cx,319
  2202.           @NORIGHTCLIP:
  2203.           cmp word ptr cs:[xs],-1
  2204.           njg @NRMAL
  2205.           push ax                   ;save the step
  2206.           sub di,word ptr cs:[xs]   ;start x=zero
  2207.           add cx,word ptr cs:[xs]   ;sub length
  2208.           push ax                   ;ax=vstep (y)
  2209.           mov bx, dx                ;startu
  2210.           mov ax,word ptr cs:[xs]
  2211.           neg ax
  2212.           imul bp                   ;ustep
  2213.           mov dx,bx
  2214.           add ax,dx                 ;new startu
  2215.           mov bx,ax                 ;save it
  2216.           mov dx,word ptr cs:[xs]
  2217.           neg dx
  2218.           pop ax                    ;vstep
  2219.           imul dx
  2220.           add si,ax                 ;new startu
  2221.           mov dx,bx                 ;new startv
  2222.           pop ax                    ;restore the step
  2223.           @NRMAL:
  2224.           dec cx                    ;adjust polygon size
  2225.           nje @LINJA                ;we don't draw too big polys, which is
  2226.                                     ;necessary when glenzing.....
  2227.           @TEXTUREline:             ;optimized for very small polys
  2228.            mov bx,si                ;no linearized/word/aligned....
  2229.            mov bl,dh
  2230.            mov bl,byte ptr ds:[bx]
  2231.            add bl,99
  2232.     COLORI:mov byte ptr es:[di],bl
  2233.            add dx,bp
  2234.            add si,ax
  2235.            inc di
  2236.            dec cx
  2237.            njne @TEXTUREline
  2238. @LINJA:
  2239.           pop si
  2240.           add si,2
  2241.  ENDLINE: cmp si,7777
  2242.           fjb @NEWLINES
  2243. AWAY:
  2244.             pop cx
  2245.             sub ecx,4
  2246.             cmp ecx,11223344h
  2247. MOO:        jnb txPLOOP
  2248.             ret
  2249.  
  2250. ;----------------------------------------------------------------------------
  2251. align 2
  2252.          xhandle        dw 0
  2253.          xmscontrol     dd 0
  2254.          fhandle        dw 0
  2255.          objectxms      dd 0  ;pointers to XMS-blocks
  2256.          projectionbuffer      dd 0
  2257.          envbufxms      dd 0
  2258.          sorttixms      dd 0
  2259.          onearrayxms    dd 0
  2260.          lastxms        dd 0
  2261.          indexinxms     dd 0
  2262.          indexoutxms    dd 0
  2263.          itemcount      dw 0
  2264.          bytenumber     dw 0
  2265.  
  2266.          elements    dw 1  ; how many different objects in the world are.
  2267.          elementxms  dd 0   ;4 bytes for each element, xms ptr
  2268.                      dd 0
  2269.                      dd 0
  2270.                      dd 0
  2271.                      dd 0
  2272.  
  2273.          elementenvxms dd 0    ;ptr for each environment map
  2274.                        dd 0    ;lame way to waste memory.......
  2275.                        dd 0
  2276.  
  2277.          transformers dw 0    ;destination element number
  2278.                       dw 1    ;source 1 element  number
  2279.                       dw 2    ;source 2 element  number
  2280.                               ;remember: (dest#<source1#<source2#)
  2281.          worldxangle dw 0
  2282.          worldyangle dw 0
  2283.          worldzangle dw 0
  2284.          viewpointx  dw 0
  2285.          viewpointy  dw 0
  2286.          viewpointz  dw 0
  2287.          viewpointxy dw 0
  2288.          camerazpos    dw 4000
  2289.          cameraypos    dw 0
  2290.          cameraxpos    dw 0
  2291.  
  2292.          world dw 1     ;how many objects there are
  2293.                         ;object format begin
  2294.                db 0     ;object type, supports 255 different objects
  2295.                db 0     ;object rotate model:
  2296.                         ;255=object is independent to the world
  2297.                         ;0=object   is stable
  2298.                dw 0     ;object.world.x pos
  2299.                dw 0     ;object.world.y pos
  2300.                dw 0     ;object.world.z pos
  2301.                dw 0     ;object.world.xy pos, just put zero here,code calcs it
  2302.                dw 0     ;object.own.xangle
  2303.                dw 0     ;object.own.yangle
  2304.                dw 0     ;object.own.zangle
  2305.                dw 8 dup (0) ;TEMPORARY SPACE FOR OBJECT !!!!!!!!!!!!
  2306.  
  2307. sortti2    dw 128 dup (0)     ;max is 64 objects
  2308. onearray2  dw 128 dup (0)
  2309. zeroarray2 dw 128 dup (0)
  2310. tempobj dw 0       ;in process object type
  2311. tempxp  dw 0       ;-----""--------- xpos
  2312. tempyp  dw 0       ;                 ypos
  2313. tempzp  dw 0       ;                 zpos
  2314. tempxy  dw 0       ;                 xypos
  2315. tempax  dw 0     ;object.own.xangle
  2316. tempay  dw 0     ;object.own.yangle
  2317. tempaz  dw 0     ;object.own.zangle
  2318. swapxy  dw 0
  2319. swap    dw 0
  2320. mframe  dw 0
  2321. madd    dw 4
  2322. ticks   dd 0
  2323. oldint  dd 0
  2324. facecount dw 0
  2325. xlen  dw 0
  2326. ylen  dw 0
  2327. fx1   dd 0
  2328. fx2   dd 0
  2329. fx3   dd 0
  2330. fy1   dd 0
  2331. fy2   dd 0
  2332. fy3   dd 0
  2333. xx1   dd 0
  2334. xx2   dd 0
  2335. xx3   dd 0
  2336. xy1   dd 0
  2337. xy2   dd 0
  2338. xy3   dd 0
  2339. ystr  dw 0
  2340. yend  dd 0
  2341. tx1   dw 0
  2342. tx2   dw 0
  2343. tx3   dw 0
  2344. ty1   dw 0
  2345. ty2   dw 0
  2346. ty3   dw 0
  2347. ttx1   dw 0
  2348. ttx2   dw 0
  2349. ttx3   dw 0
  2350. tty1   dw 0
  2351. tty2   dw 0
  2352. tty3   dw 0
  2353. xstep  dw 0
  2354. ustep  dw 0
  2355. vstep  dw 0
  2356. tstartv dw 0
  2357. tstartu dw 0
  2358. ux1   db 0
  2359. uy1   db 0
  2360. ux2   db 0
  2361. uy2   db 0
  2362. ux3   db 0
  2363. uy3   db 0
  2364. yadd   dw 200 dup (0)
  2365. xleft  dw 200 dup (0)
  2366. xright dw 200 dup (0)
  2367. uleft  dw 200 dup (0)
  2368. uright dw 200 dup (0)
  2369. facesb dw 0
  2370. fcount dw 0
  2371. maski dw 0
  2372. xpos2d dw 160
  2373. ypos2d dw 100
  2374. zclipnear dw 512           ;ZCLIP NEAR
  2375. ye  dw 0
  2376. ys  dw 0
  2377. xs  dw 0
  2378. xe  dw 0
  2379. six dw 0
  2380. siy dw 0
  2381. siz dw 0
  2382. cox dw 0
  2383. coy dw 0
  2384. coz dw 0
  2385. r11 dw 0
  2386. r12 dw 0
  2387. r13 dw 0
  2388. r21 dw 0
  2389. r22 dw 0
  2390. r23 dw 0
  2391. r31 dw 0
  2392. r32 dw 0
  2393. r33 dw 0
  2394. frame dd 0
  2395. temp  dw 0
  2396. align 2
  2397. sine dw 1,2,4,5,7,8,10,11,13,15,16,18,19,21,22,24,26    ;1024 angles
  2398. dw 27,29,30,32,33,35,37,38,40,41,43,44,46,47,49,50
  2399. dw 52,54,55,57,58,60,61,63,64,66,67,69,70,72,73,75
  2400. dw 76,78,79,81,82,84,85,87,88,90,91,93,94,96,97,98
  2401. dw 100,101,103,104,106,107,109,110,111,113,114,116,117,118,120,121
  2402. dw 123,124,125,127,128,129,131,132,133,135,136,137,139,140,141,143
  2403. dw 144,145,147,148,149,150,152,153,154,156,157,158,159,160,162,163
  2404. dw 164,165,167,168,169,170,171,172,174,175,176,177,178,179,180,182
  2405. dw 183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198
  2406. dw 199,200,201,202,203,204,205,206,207,208,209,210,211,212,212,213
  2407. dw 214,215,216,217,218,218,219,220,221,222,222,223,224,225,226,226
  2408. dw 227,228,228,229,230,231,231,232,233,233,234,235,235,236,236,237
  2409. dw 238,238,239,239,240,240,241,242,242,243,243,244,244,245,245,245
  2410. dw 246,246,247,247,248,248,248,249,249,250,250,250,251,251,251,252
  2411. dw 252,252,252,253,253,253,253,254,254,254,254,255,255,255,255,255
  2412. dw 255,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256
  2413. dw 256,256,256,256,256,256,256,256,256,256,256,256,256,256,255,255
  2414. dw 255,255,255,255,254,254,254,254,253,253,253,253,252,252,252,252
  2415. dw 251,251,251,250,250,250,249,249,248,248,248,247,247,246,246,245
  2416. dw 245,245,244,244,243,243,242,242,241,240,240,239,239,238,238,237
  2417. dw 236,236,235,235,234,233,233,232,231,231,230,229,228,228,227,226
  2418. dw 226,225,224,223,222,222,221,220,219,218,218,217,216,215,214,213
  2419. dw 212,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198
  2420. dw 197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182
  2421. dw 180,179,178,177,176,175,174,172,171,170,169,168,167,165,164,163
  2422. dw 162,160,159,158,157,156,154,153,152,150,149,148,147,145,144,143
  2423. dw 141,140,139,137,136,135,133,132,131,129,128,127,125,124,123,121
  2424. dw 120,118,117,116,114,113,111,110,109,107,106,104,103,101,100,98
  2425. dw 97,96,94,93,91,90,88,87,85,84,82,81,79,78,76,75
  2426. dw 73,72,70,69,67,66,64,63,61,60,58,57,55,54,52,50
  2427. dw 49,47,46,44,43,41,40,38,37,35,33,32,30,29,27,26
  2428. dw 24,22,21,19,18,16,15,13,11,10,8,7,5,4,2,1
  2429. dw -1,-3,-4,-6,-7,-9,-10,-12,-14,-15,-17,-18,-20,-21,-23,-25
  2430. dw -26,-28,-29,-31,-32,-34,-36,-37,-39,-40,-42,-43,-45,-46,-48,-49
  2431. dw -51,-53,-54,-56,-57,-59,-60,-62,-63,-65,-66,-68,-69,-71,-72,-74
  2432. dw -75,-77,-78,-80,-81,-83,-84,-86,-87,-89,-90,-92,-93,-95,-96,-97
  2433. dw -99,-100,-102,-103,-105,-106,-108,-109,-110,-112,-113,-115,-116,-117,-119,-120
  2434. dw -122,-123,-124,-126,-127,-128,-130,-131,-132,-134,-135,-136,-138,-139,-140,-142
  2435. dw -143,-144,-146,-147,-148,-149,-151,-152,-153,-155,-156,-157,-158,-159,-161,-162
  2436. dw -163,-164,-166,-167,-168,-169,-170,-171,-173,-174,-175,-176,-177,-178,-179,-181
  2437. dw -182,-183,-184,-185,-186,-187,-188,-189,-190,-191,-192,-193,-194,-195,-196,-197
  2438. dw -198,-199,-200,-201,-202,-203,-204,-205,-206,-207,-208,-209,-210,-211,-211,-212
  2439. dw -213,-214,-215,-216,-217,-217,-218,-219,-220,-221,-221,-222,-223,-224,-225,-225
  2440. dw -226,-227,-227,-228,-229,-230,-230,-231,-232,-232,-233,-234,-234,-235,-235,-236
  2441. dw -237,-237,-238,-238,-239,-239,-240,-241,-241,-242,-242,-243,-243,-244,-244,-244
  2442. dw -245,-245,-246,-246,-247,-247,-247,-248,-248,-249,-249,-249,-250,-250,-250,-251
  2443. dw -251,-251,-251,-252,-252,-252,-252,-253,-253,-253,-253,-254,-254,-254,-254,-254
  2444. dw -254,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255
  2445. dw -255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-254,-254
  2446. dw -254,-254,-254,-254,-253,-253,-253,-253,-252,-252,-252,-252,-251,-251,-251,-251
  2447. dw -250,-250,-250,-249,-249,-249,-248,-248,-247,-247,-247,-246,-246,-245,-245,-244
  2448. dw -244,-244,-243,-243,-242,-242,-241,-241,-240,-239,-239,-238,-238,-237,-237,-236
  2449. dw -235,-235,-234,-234,-233,-232,-232,-231,-230,-230,-229,-228,-227,-227,-226,-225
  2450. dw -225,-224,-223,-222,-221,-221,-220,-219,-218,-217,-217,-216,-215,-214,-213,-212
  2451. dw -211,-211,-210,-209,-208,-207,-206,-205,-204,-203,-202,-201,-200,-199,-198,-197
  2452. dw -196,-195,-194,-193,-192,-191,-190,-189,-188,-187,-186,-185,-184,-183,-182,-181
  2453. dw -179,-178,-177,-176,-175,-174,-173,-171,-170,-169,-168,-167,-166,-164,-163,-162
  2454. dw -161,-159,-158,-157,-156,-155,-153,-152,-151,-149,-148,-147,-146,-144,-143,-142
  2455. dw -140,-139,-138,-136,-135,-134,-132,-131,-130,-128,-127,-126,-124,-123,-122,-120
  2456. dw -119,-117,-116,-115,-113,-112,-110,-109,-108,-106,-105,-103,-102,-100,-99,-97
  2457. dw -96,-95,-93,-92,-90,-89,-87,-86,-84,-83,-81,-80,-78,-77,-75,-74
  2458. dw -72,-71,-69,-68,-66,-65,-63,-62,-60,-59,-57,-56,-54,-53,-51,-49
  2459. dw -48,-46,-45,-43,-42,-40,-39,-37,-36,-34,-32,-31,-29,-28,-26,-25
  2460. dw -23,-21,-20,-18,-17,-15,-14,-12,-10,-9,-7,-6,-4,-3,-1,1
  2461. cose dw 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,255,255
  2462. dw 255,255,255,255,254,254,254,254,253,253,253,253,252,252,252,252
  2463. dw 251,251,251,250,250,250,249,249,248,248,248,247,247,246,246,245
  2464. dw 245,245,244,244,243,243,242,242,241,240,240,239,239,238,238,237
  2465. dw 236,236,235,235,234,233,233,232,231,231,230,229,228,228,227,226
  2466. dw 226,225,224,223,222,222,221,220,219,218,218,217,216,215,214,213
  2467. dw 212,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198
  2468. dw 197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182
  2469. dw 180,179,178,177,176,175,174,172,171,170,169,168,167,165,164,163
  2470. dw 162,160,159,158,157,156,154,153,152,150,149,148,147,145,144,143
  2471. dw 141,140,139,137,136,135,133,132,131,129,128,127,125,124,123,121
  2472. dw 120,118,117,116,114,113,111,110,109,107,106,104,103,101,100,98
  2473. dw 97,96,94,93,91,90,88,87,85,84,82,81,79,78,76,75
  2474. dw 73,72,70,69,67,66,64,63,61,60,58,57,55,54,52,50
  2475. dw 49,47,46,44,43,41,40,38,37,35,33,32,30,29,27,26
  2476. dw 24,22,21,19,18,16,15,13,11,10,8,7,5,4,2,1
  2477. dw -1,-3,-4,-6,-7,-9,-10,-12,-14,-15,-17,-18,-20,-21,-23,-25
  2478. dw -26,-28,-29,-31,-32,-34,-36,-37,-39,-40,-42,-43,-45,-46,-48,-49
  2479. dw -51,-53,-54,-56,-57,-59,-60,-62,-63,-65,-66,-68,-69,-71,-72,-74
  2480. dw -75,-77,-78,-80,-81,-83,-84,-86,-87,-89,-90,-92,-93,-95,-96,-97
  2481. dw -99,-100,-102,-103,-105,-106,-108,-109,-110,-112,-113,-115,-116,-117,-119,-120
  2482. dw -122,-123,-124,-126,-127,-128,-130,-131,-132,-134,-135,-136,-138,-139,-140,-142
  2483. dw -143,-144,-146,-147,-148,-149,-151,-152,-153,-155,-156,-157,-158,-159,-161,-162
  2484. dw -163,-164,-166,-167,-168,-169,-170,-171,-173,-174,-175,-176,-177,-178,-179,-181
  2485. dw -182,-183,-184,-185,-186,-187,-188,-189,-190,-191,-192,-193,-194,-195,-196,-197
  2486. dw -198,-199,-200,-201,-202,-203,-204,-205,-206,-207,-208,-209,-210,-211,-211,-212
  2487. dw -213,-214,-215,-216,-217,-217,-218,-219,-220,-221,-221,-222,-223,-224,-225,-225
  2488. dw -226,-227,-227,-228,-229,-230,-230,-231,-232,-232,-233,-234,-234,-235,-235,-236
  2489. dw -237,-237,-238,-238,-239,-239,-240,-241,-241,-242,-242,-243,-243,-244,-244,-244
  2490. dw -245,-245,-246,-246,-247,-247,-247,-248,-248,-249,-249,-249,-250,-250,-250,-251
  2491. dw -251,-251,-251,-252,-252,-252,-252,-253,-253,-253,-253,-254,-254,-254,-254,-254
  2492. dw -254,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255
  2493. dw -255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-254,-254
  2494. dw -254,-254,-254,-254,-253,-253,-253,-253,-252,-252,-252,-252,-251,-251,-251,-251
  2495. dw -250,-250,-250,-249,-249,-249,-248,-248,-247,-247,-247,-246,-246,-245,-245,-244
  2496. dw -244,-244,-243,-243,-242,-242,-241,-241,-240,-239,-239,-238,-238,-237,-237,-236
  2497. dw -235,-235,-234,-234,-233,-232,-232,-231,-230,-230,-229,-228,-227,-227,-226,-225
  2498. dw -225,-224,-223,-222,-221,-221,-220,-219,-218,-217,-217,-216,-215,-214,-213,-212
  2499. dw -211,-211,-210,-209,-208,-207,-206,-205,-204,-203,-202,-201,-200,-199,-198,-197
  2500. dw -196,-195,-194,-193,-192,-191,-190,-189,-188,-187,-186,-185,-184,-183,-182,-181
  2501. dw -179,-178,-177,-176,-175,-174,-173,-171,-170,-169,-168,-167,-166,-164,-163,-162
  2502. dw -161,-159,-158,-157,-156,-155,-153,-152,-151,-149,-148,-147,-146,-144,-143,-142
  2503. dw -140,-139,-138,-136,-135,-134,-132,-131,-130,-128,-127,-126,-124,-123,-122,-120
  2504. dw -119,-117,-116,-115,-113,-112,-110,-109,-108,-106,-105,-103,-102,-100,-99,-97
  2505. dw -96,-95,-93,-92,-90,-89,-87,-86,-84,-83,-81,-80,-78,-77,-75,-74
  2506. dw -72,-71,-69,-68,-66,-65,-63,-62,-60,-59,-57,-56,-54,-53,-51,-49
  2507. dw -48,-46,-45,-43,-42,-40,-39,-37,-36,-34,-32,-31,-29,-28,-26,-25
  2508. dw -23,-21,-20,-18,-17,-15,-14,-12,-10,-9,-7,-6,-4,-3,-1,1
  2509. dw 2,4,5,7,8,10,11,13,15,16,18,19,21,22,24,26
  2510. dw 27,29,30,32,33,35,37,38,40,41,43,44,46,47,49,50
  2511. dw 52,54,55,57,58,60,61,63,64,66,67,69,70,72,73,75
  2512. dw 76,78,79,81,82,84,85,87,88,90,91,93,94,96,97,98
  2513. dw 100,101,103,104,106,107,109,110,111,113,114,116,117,118,120,121
  2514. dw 123,124,125,127,128,129,131,132,133,135,136,137,139,140,141,143
  2515. dw 144,145,147,148,149,150,152,153,154,156,157,158,159,160,162,163
  2516. dw 164,165,167,168,169,170,171,172,174,175,176,177,178,179,180,182
  2517. dw 183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198
  2518. dw 199,200,201,202,203,204,205,206,207,208,209,210,211,212,212,213
  2519. dw 214,215,216,217,218,218,219,220,221,222,222,223,224,225,226,226
  2520. dw 227,228,228,229,230,231,231,232,233,233,234,235,235,236,236,237
  2521. dw 238,238,239,239,240,240,241,242,242,243,243,244,244,245,245,245
  2522. dw 246,246,247,247,248,248,248,249,249,250,250,250,251,251,251,252
  2523. dw 252,252,252,253,253,253,253,254,254,254,254,255,255,255,255,255
  2524. dw 255,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256
  2525. flipflop db 1              ;select page
  2526. msg   db 'Exit OK.     ',0dh,0ah,'$'       ;error msgs
  2527.       db 'Undefined    ',0dh,0ah,'$'
  2528.       db 'No XMS-driver',0dh,0ah,'$'
  2529.       db 'Out of XMS   ',0dh,0ah,'$'
  2530.       db 'File missing ',0dh,0ah,'$'
  2531.       db 'Undefined    ',0dh,0ah,'$'
  2532.       db 'Undefined    ',0dh,0ah,'$'
  2533.       db 'Remove EMM!  ',0dh,0ah,'$'
  2534.       db 'Undefined    ',0dh,0ah,'$'
  2535.       db 'Undefined    ',0dh,0ah,'$'
  2536.       db 'Undefined    ',0dh,0ah,'$'
  2537. tfx db 0
  2538. color  db 1
  2539. names  db 'ob1.dcc',0  ;here file names, 8 max char
  2540.        db 'ri2.dcc',0
  2541.        db 'ob2.dcc',0
  2542.  
  2543. title3 db 0dh,0ah, 'Chevrolet 3D for 32bit RealFlatMode by Zjack/DCC',0dh,0ah,'$'
  2544. title2 db 'Loading stuff.','$'
  2545. dot    db '.','$'
  2546. errr  db 0                    ;errormsg  (0=exit ok)
  2547. align 2
  2548. path   dw 6*1024 dup (0)  ;camera path for 1024 frames motion
  2549. end
  2550.  
  2551.